PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++]String an überladene Funktion übergeben


pippo
2006-07-23, 23:32:15
Hab gerade ein kleines Problem beim Übergeben eines Strings, das ich mir nicht erklären kann:

In der Main.cpp stehen die Prototypen

void Funktion();
void Funktion(char []);


sowie die Funktionen selbst

void Funktion(){ cout << "..."; }
void Funktion (char Text[]) { cout << Text; }


In der Klasse.cpp werden die Funktionen aufgerufen

Funktion();
Funktion("Test");



Das Problem:
Der 1. Aufruf funktioniert, der 2. nicht. Die Meldung: Die Funktion akzeptiert keine 1 Argumente. Mir ist nur der Grund nicht ganz klar, aber ich schätz es liegt irgendwo am String.

Coda
2006-07-23, 23:39:43
Welcher Compiler?

pippo
2006-07-23, 23:47:37
Der aus Visual Studio .net

del_4901
2006-07-23, 23:48:47
Geht es denn auch ohne die Funktion()?

Ich glaube mit Literalen darf man sowas gar nicht anstellen! Zumindestens darf man sich keine Zeiger auf Literale hohlen. und [] ist nur Syntaktischer Zucker für einen Zeiger.

Wenn du eh C++ nimmst nimm doch einfach string da geht es auf jeden Fall!

pippo
2006-07-23, 23:54:01
Das Problem ist, dass ich gern ein Array übergeben will, da in dem Text auch zahlen vorkommen, die erst zur Laufzeit bekannt und auch geändert werden. Mit einem Array könnte ich das sehr einfach lösen

del_4901
2006-07-24, 00:01:01
pippo[/POST]']Das Problem ist, dass ich gern ein Array übergeben will, da in dem Text auch zahlen vorkommen, die erst zur Laufzeit bekannt und auch geändert werden. Mit einem Array könnte ich das sehr einfach lösen

Das ist mit string noch einfacher als mit einem array! Da muss man sich nicht immer kümmern wieviel Speicher man nun eigendl. braucht etc.

Coda
2006-07-24, 00:19:21
Ist doch Käse. C++ erlaubt es auf jedenfall eine Funktion mit keinem Parameter und char* zu überladen.

Zeig mal den ganzen Source.

del_4901
2006-07-24, 00:51:49
Coda[/POST]']Ist doch Käse. C++ erlaubt es auf jedenfall eine Funktion mit keinem Parameter und char* zu überladen.

Zeig mal den ganzen Source.
Ach nee, davon redet keiner es geht darum das man sich keine Zeiger von Literalen hohlen kann! Zumindestens hab ich das in irgendeinem Zusammenhang mal gelesen.

@Topic:
char* x = "Test";
Funktion(x);

geht oder geht ned?

Coda
2006-07-24, 01:21:23
Natürlich geht da.

pippo
2006-07-24, 09:32:28
@Coda
Also der richtige Code ist fast 1000 Zeilen. Die Funktionen die ich gepostet hab, entsprechen aber absoult dem Original, nur, dass ich in meiner Funktion noch ein system("cls") drin hab und nen anderen Text ausgebe. Statt "Test" will ich auch mal ein ganzes Array übergeben, aber das sollte ja keinen Unterschied machen, oder?

Es ist ja nicht das erste mal, dass ich ein Array übergebe, nur ein char-Array hab ich noch nie übergeben, weil ichs noch nie brauchte.

@ AlphaTier
Ich habs mit String noch nie probiert, kann mir aber nicht vorstellen, dass es einfacher ist, als Text[8]++;

Matrix316
2006-07-24, 09:59:42
Könnte es vielleicht so gehen:


void Funktion();
void Funktion(char *);


void Funktion(){ cout << "..."; }
void Funktion (char *Text) { cout << Text; }

Oder so ähnlich... :rolleyes:

pippo
2006-07-24, 10:06:17
Ne, gleiches Problem

pippo
2006-07-24, 10:22:11
Was ich gerade noch herausgefunden hab und schon viel früher hätte probieren können:

In der Main.cpp kann ich beide Funktionen ohne Problelme aufrufen, in der Klasse.cpp nur die Funktion, die kein Argument enthält.
Ist es möglich, dass man für überladene Funktionen was spezielles implementieren muss? Meine Klasse.h sieht so aus:

typedef unsigned short USHORT;
#pragma once
#include <iostream>
#include <vector>
using namespace std;

class cDaten {
private:
...
public:
...
};

Matrix316
2006-07-24, 10:40:11
Komisch, bei mir funktioniert es mit mit Visual C++ 2005 Express Edition.

Also so:

Header1.h File für Klasse: (inline ;))
#include <iostream>

class test {
public:
void Funktion(){ std::cout << "..."; }

void Funktion(char Text[]) { std::cout << Text; }
};

cpp File mit Funktion die andere Funktionen aufruft
#include "stdafx.h"
#include "Header1.h"
#include <iostream>

void testfunc (void)
{
test Neu;
char *str;
Neu.Funktion();
Neu.Funktion("Hallo");
std::cin >> str;
std::cout << str;
}

Header File für um in Main aufzurufen ;)
void testfunc();

Main File
#include "stdafx.h"
#include <iostream>
#include "Header2.h"

int _tmain(int argc, _TCHAR* argv[])
{
testfunc();

return 0;
}

pippo
2006-07-24, 12:04:46
Bei mir sind es aber keine Elementfunktionen

Matrix316
2006-07-24, 18:35:38
Sondern? Wo rufst du die den auf wo es nicht geht?

Coda
2006-07-24, 18:59:21
Matrix316[/POST]']Könnte es vielleicht so gehen:
Das ist absolut äquivalent.

Xmas
2006-07-24, 23:01:17
Wenn die Prototypen in Main.cpp stehen und nicht in einer Header-Datei, wie sollen die Funktionen dann beim Kompilieren von Klasse.cpp bekannt sein?

pippo
2006-07-25, 00:41:24
Es ist ja keine Funktion der Klasse, sondern (keine Ahnung ob man es so nennt :) ) eine globale Funktion, die in der Main.cpp steht. Da die Funktion von mehreren Klassen aufgerufen wird und auch von der Funktionsweise her nicht unbedingt in eine Klasse sollte, hab ich sie einfach wie ein paar andere Funktionen auch in die Main.cpp geschrieben.

Die Klasse, welche die Funktion aufruft, ist über #include "Klasse.h" in die Main.cpp eingebunden.

Sowohl der Prototypen als auch die Funktionen an sich stehen direkt unter/übereinander in der Main.cpp. In der Klasse.cpp kann ich aber nur die Funktion aufrufen, die kein Argument enthält.

Ich könnte schon eine Element/Memberfunktion draus machen, aber finde das unschön, da ich diese Funktionen dann in jede Klasse kopieren muss und falls mal was geändert wird, muss man das eben für jede Klasse einzeln machen. Ich kenn mich da ja nicht so aus, aber finde sowas sollte man nicht so lösen

Spearhead
2006-07-25, 01:16:52
mach's doch mit ner Basisklasse die dann in die andren Klassen vererbt wird, dann mußt du Veränderungen nur einmal vornehmen.

del_4901
2006-07-25, 02:38:59
Xmas hat schon recht, jetzt wo ich das seh ist es klar warum das so nicht gehen kann.

pippo
2006-07-25, 09:32:49
Und warum funktioniert es dann bei der Funktion ohne Argumente? Die ist ja scheinbar bekannt. Als ich mich damals schlau gemacht hab, wie man so ein Programm auf meherere .cpp und .h aufteilt, war was gestanden, dass man von der Main.cpp keine .h anlegt. Ist dem nicht so?

Matrix316
2006-07-25, 10:23:50
Hast du zufällig die Prototypen bzw. die deklaration der Funktionen vor dem include der Klasse in der du diese nutzen willst?

Warum packst du nicht die globalen Funktionen in ein CPP File und machst ein Header File, welches alle Files nutzen, welche die globalen Funktionen benötigen?

pippo
2006-07-25, 10:58:57
Das hatt ich schon, aber dann hat 1 Funktion nicht mehr das gemacht, was sie vorher machte. Mitlerweile hab ich die Funktion aber wieder überarbeitet, so dass es wieder funktionieren könnte. Trotzdem würde mich interessieren, warum es so nicht funktioniert.

Der Prototyp steht nach dem include der Klasse, so hab ichs auch gelernt.

Trap
2006-07-25, 11:29:38
Ohne Beispielcode der tatsächlich das Problem zeigt was du hattest, ist das alles blindes Raten. Manchmal findet man damit die Ursache, aber meistens ist es Zeitverschwendung für alle Beteiligten.

Matrix316
2006-07-25, 13:39:42
pippo[/POST]']Das hatt ich schon, aber dann hat 1 Funktion nicht mehr das gemacht, was sie vorher machte. Mitlerweile hab ich die Funktion aber wieder überarbeitet, so dass es wieder funktionieren könnte. Trotzdem würde mich interessieren, warum es so nicht funktioniert.

Der Prototyp steht nach dem include der Klasse, so hab ichs auch gelernt. Tja, wäre die Frage, woher wissen die Funktionen außerhalb den Namen der Funktionen die im Main deklariert und definiert sind? :wink: Oder gibts vielleicht noch eine Funktion die den Namen der ersten hat?

Xmas
2006-07-25, 18:21:58
pippo[/POST]']Und warum funktioniert es dann bei der Funktion ohne Argumente? Die ist ja scheinbar bekannt. Als ich mich damals schlau gemacht hab, wie man so ein Programm auf meherere .cpp und .h aufteilt, war was gestanden, dass man von der Main.cpp keine .h anlegt. Ist dem nicht so?
Dem ist in der Regel so, aber deshalb packt man auch keine Funktionen in eine Main.cpp die man außerhalb benötigt. Wenn der Compiler Klasse.cpp kompiliert, hat er von den in Main.cpp deklarierten und definierten Funktionen keine Kenntnis. Die "öffentlichen" Teile einer Kompilationseinheit, also Deklarationen die woanders gebraucht werden, gehören in eine Header-Datei welche überall dort eingebunden werden muss wo die entsprechenden Deklarationen vonnöten sind.

Die Fehlermeldung die du bekommst deutet aber darauf hin dass bereits eine andere Funktion mit diesem Namen existiert.

pippo
2006-07-25, 20:15:40
Ich hab die Funktionen jetzt wieder ausgelagert und es funktioniert wieder alles. Ich werds dann dabei belassen :)