Mysterium Cpp

deh3nne

Mitglied
Hallo,

Wir schreiben ein Projekt in Cpp und haben derzeit einige Probleme.
Im Anhang befinden sich die Dateien eines stark reduzierten Beispielprojektes, welches den Fehler den wir haben sehr gut sichtbar macht.

Folgendes Problem:

Wir erzeugen in der Klasse SqlStruct eine Instanz von Select im Header

Code:
namespace sql{
	class SqlStruct
	{
	public:
		sql::Select s;

		SqlStruct(void);	
		SqlStruct(std::string statement);
		~SqlStruct(void);
		
		bool accept(Visitor v);
	};
};

in der Cpp führen wir auf dieses Select eine Methode aus:
Code:
sql::SqlStruct::SqlStruct(std::string statement)
{
	s = sql::Select();
	s.test();
	std::cout << "please instert SQL Expression:" << std::endl << std::endl;
}

das funktioniert nun...

Wenn wir aber in der Klasse Select nun eine Änderung z.B. in der Methode die ausgeführt wird vornehmen dann bekommen wir einige Fehler. Wenn wir diese Änderungen nun rückgängig machen und dann kompilieren und ausführen erhalten wir aber die selben Fehler. Erst wenn wir die definition von Select im Sqlstruct auskommentieren, kompilieren und wieder mit reinnehmen und dann kompilieren gehts wieder...

Wir sind ratlos und hoffen auf eure Hilfe...

Ps: getestet in VS2010_Sp1 und bloodshed alle Dateien auch im Anhang
 

Anhänge

Stimmt, das wäre noch praktisch:

Code:
Fehler	2	error C2039: 'Select': Ist kein Element von 'sql'	...\sqlstruct.hpp	16
Fehler	3	error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 's'	...\sqlstruct.hpp	16
Fehler	4	error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.	...\sqlstruct.hpp	16
Fehler	5	error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.	...\sqlstruct.hpp	16
	6	IntelliSense: "namespace "sql"" hat keinen Member ""Select"".	...\sqlstruct.hpp	16

Zeile 16 entspricht:
Code:
		sql::Select s;
 
Vermutlich kommt der Compiler mit den Namespaces durcheinander, weil du dir selbst einen mit Namen sql definierst und gleichzeitig einen anderen verwendest in dem z.B.: das Select drin ist. Die Fehlermeldungen bedeuten einfach nur das der Typ sql:Select nicht aufgelöst werden kann.
 
Hab grad versucht mit deinen Code Dateien ein funktionierendes Programm zu bauen. Das mit den Namespaces war nur halb richtig, das eigentliche Problem ist wie du mit den zyklischen Abhängigkeiten umgehst:

Du darfst wenn du in einer Datei (z.B.: SqlStruct.hpp) einen Prototyp anlegst nicht auch das zugehörige Headerfile inkludieren, sondern must dies in der cpp Datei machen:

C++:
/* SqlStruct.hpp */
#pragma once

#include <string>
#include <iostream>

//Diese Zeile muss hier weg...
//#include "Visitor.hpp"
#include "Select.hpp"


class Visitor;

namespace sql{
	class SqlStruct
	{
	public:
		sql::Select s;

		SqlStruct(void);	
		SqlStruct(std::string statement);
		~SqlStruct(void);
		
		bool accept(Visitor v);
	};
};

C++:
/* SqlStruct.cpp */
#include "SqlStruct.hpp"

//... dafür muss es da her
#include "Visitor.hpp"

sql::SqlStruct::SqlStruct(void)
{
}

sql::SqlStruct::SqlStruct(std::string statement)
{
	s = sql::Select();
	s.test();
	std::cout << "please instert SQL Expression:" << std::endl << std::endl;
}


sql::SqlStruct::~SqlStruct(void)
{
}

bool sql::SqlStruct::accept(Visitor v)
{
	return false;
}

Selbiges gilt auch für die Select.hpp und Select.cpp.

Zweitens gehört in der Visitor.hpp definitiv kein Prototyp für die SqlStruct Klasse hin.
C++:
#pragma once

#include <string>
#include <iostream>

#include "Sqlstruct.hpp"

//Weg damit, da zyklische Abhängigkeiten nur an einer Stelle gelöst werden sollten
/*namespace sql{
	class SqlStruct;
};*/

class Visitor
{
public:
	Visitor(void);
	~Visitor(void);
	
	bool visit(sql::SqlStruct sql_Structure);
};
 
Zuletzt bearbeitet von einem Moderator:
Zurück