Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2020-12-02, 20:30
  #1
Medlem
Har följande kod som fungerar, allt deklarerat i en fil, "simple_test.cpp" enligt följande:
(notera att jag kommenterat ut #include "simple.h" eftersom jag kör allt från denna fil)

Kod:
#include <iostream>
#include <vector>
// #include "simple.h"

using std::cout;
using std::endl;
using std::vector;


class Simple {
public:
	Simple() = default;
	Simple(int aa)						:a(aa) {}
	Simple(int aa, int bb)				:a(aa), b(bb) {}
	Simple(int aa, int bb, int cc)		:a(aa), b(bb), c(cc) {}
	

	std::vector<int> getVals(){
		std::vector<int> vals{};
		vals.push_back(a);
		vals.push_back(b);
		vals.push_back(c);
		return vals;
	};
	

private:
	int a {-1};
	int b {-1};
	int c {-1};

	
};


int main(){
	
	Simple simpX = Simple();
	Simple simpC = Simple(1,2,3);
	
	std::vector<int> valsX = simpX.getVals();
	std::vector<int> valsC = simpC.getVals();

	cout << "x1: " << valsX[1] << " ";
	cout << " x2: " << valsX[0] << " ";
	cout << " x3: " << valsX[2] << " " << endl;

	cout << "c1: " << valsC[0] << " ";
	cout << " c2: " << valsC[1] << " ";
	cout << " c3: " << valsC[2] << " " << endl;
	
	
	return 0;
}

Jag får bara inte rätt på det när jag vill lägga definitionen i en header-fil och deklarationen i en annan fil.

Såhär såg min header-fil, "simple.h" ut:

Kod:
#include <string>
#include <vector>

class Simple {
public:
	Simple() = default;
	Simple(int aa)						:a(aa) {}
	Simple(int aa, int bb)				:a(aa), b(bb) {}
	Simple(int aa, int bb, int cc)		:a(aa), b(bb), c(cc) {}
	
	std::vector<int> getVals(const int& val) const;

private:
	int a {-1};
	int b {-1};
	int c {-1};

};

och min deklarationsfil, "simple.ccp" såg ut så här:

Kod:
#include <string>
#include <vector>
#include "simple.h"

using std::string;
using std::vector;



Simple::Simple {
	
	
	std::vector<int> Simple::getVals(){
		std::vector<int> vals{};
		vals.push_back(a);
		vals.push_back(b);
		vals.push_back(c);
		return vals;
	}

}

Jag får följande felmeddelande:
/usr/bin/ld: simple_test.cpp: (.text+0x6e): undefined reference to `Simple::getVals()'
Citera
2020-12-02, 20:47
  #2
Medlem
Trollfeeders avatar
Citat:
Ursprungligen postat av dagsvag
Har följande kod som fungerar, allt deklarerat i en fil, "simple_test.cpp" enligt följande:
(notera att jag kommenterat ut #include "simple.h" eftersom jag kör allt från denna fil)

Kod:
#include <iostream>
#include <vector>
// #include "simple.h"

using std::cout;
using std::endl;
using std::vector;


class Simple {
public:
	Simple() = default;
	Simple(int aa)						:a(aa) {}
	Simple(int aa, int bb)				:a(aa), b(bb) {}
	Simple(int aa, int bb, int cc)		:a(aa), b(bb), c(cc) {}
	

	std::vector<int> getVals(){
		std::vector<int> vals{};
		vals.push_back(a);
		vals.push_back(b);
		vals.push_back(c);
		return vals;
	};
	

private:
	int a {-1};
	int b {-1};
	int c {-1};

	
};


int main(){
	
	Simple simpX = Simple();
	Simple simpC = Simple(1,2,3);
	
	std::vector<int> valsX = simpX.getVals();
	std::vector<int> valsC = simpC.getVals();

	cout << "x1: " << valsX[1] << " ";
	cout << " x2: " << valsX[0] << " ";
	cout << " x3: " << valsX[2] << " " << endl;

	cout << "c1: " << valsC[0] << " ";
	cout << " c2: " << valsC[1] << " ";
	cout << " c3: " << valsC[2] << " " << endl;
	
	
	return 0;
}

Jag får bara inte rätt på det när jag vill lägga definitionen i en header-fil och deklarationen i en annan fil.

Såhär såg min header-fil, "simple.h" ut:

Kod:
#include <string>
#include <vector>

class Simple {
public:
	Simple() = default;
	Simple(int aa)						:a(aa) {}
	Simple(int aa, int bb)				:a(aa), b(bb) {}
	Simple(int aa, int bb, int cc)		:a(aa), b(bb), c(cc) {}
	
	std::vector<int> getVals(const int& val) const;

private:
	int a {-1};
	int b {-1};
	int c {-1};

};

och min deklarationsfil, "simple.ccp" såg ut så här:

Kod:
#include <string>
#include <vector>
#include "simple.h"

using std::string;
using std::vector;



Simple::Simple {
	
	
	std::vector<int> Simple::getVals(){
		std::vector<int> vals{};
		vals.push_back(a);
		vals.push_back(b);
		vals.push_back(c);
		return vals;
	}

}

Jag får följande felmeddelande:
/usr/bin/ld: simple_test.cpp: (.text+0x6e): undefined reference to `Simple::getVals()'

Parameterlistorna matchar inte.
Citera
2020-12-02, 20:50
  #3
Medlem
Du deklarerar för tillfället din Simple::getVals inom konstruktorn för simple-klassen, skriv istället så här i din simple.cpp:

Kod:
Simple::Simple {}
std::vector<int> Simple::getVals(){
		std::vector<int> vals{};
		vals.push_back(a);
		vals.push_back(b);
		vals.push_back(c);
		return vals;
}

Konstruktorn innefattar kod som körs när du instantierar klassen, och bör inte innehålla funktions-deklarationer.
Citera
2020-12-02, 20:51
  #4
Medlem
Citat:
Ursprungligen postat av Trollfeeder
Parameterlistorna matchar inte.
Just ja, det också!
Citera
2020-12-02, 21:13
  #5
Medlem
Citat:
Ursprungligen postat av Transient
Konstruktorn innefattar kod som körs när du instantierar klassen, och bör inte innehålla funktions-deklarationer.

Jag inser ju att du har helt rätt och det är helt rimligt. Insåg bara inte att det faktiskt var konstruktorn, men nu känns det självklart. Stort tack till er båda!
Citera
2020-12-02, 21:14
  #6
Medlem
Citat:
Ursprungligen postat av Trollfeeder
Parameterlistorna matchar inte.
Var? Osäker på vilka du menar.
Citera
2020-12-02, 21:33
  #7
Medlem
Citat:
Ursprungligen postat av dagsvag
Var? Osäker på vilka du menar.
I din headerfil:
Kod:
std::vector<int> getVals(const int& val) const;
I din .cpp-fil
Kod:
std::vector<int> Simple::getVals()

Kompilatorn förväntar sig alltså att det finns en funktion getVals(const int& val), men du deklarerar getVals() i din cpp - dessa behandlas som separata funktioner. Det kan alltså finnas en funktion getVals med parametrarna 'const int& val', och det kan finnas en funktion getVals helt utan parametrar.
Citera
2020-12-02, 22:07
  #8
Medlem
Trollfeeders avatar
Citat:
Ursprungligen postat av dagsvag
Var? Osäker på vilka du menar.

Det är inte så många, så varför kollar du inte bara? Men som ovan skrev, så är det i getVals().
Citera
2020-12-02, 23:56
  #9
Medlem
Citat:
Ursprungligen postat av Trollfeeder
Det är inte så många, så varför kollar du inte bara? Men som ovan skrev, så är det i getVals().
Ojsan, jag hade tydligen korrigerat det efter att jag postade min kod. Så är ska vara lika. Samma parameterlistor.
Men det funkar inte =/
Och kan inte förstå vad jag missar.

Får följande felmeddelande:
simple_test.cpp: (.text+0x85): undefined reference to `Simple::getVals()'

simple.h
Kod:
class Simple {
public:
	Simple() = default;
	Simple(int aa)						:a(aa) {}
	Simple(int aa, int bb)				:a(aa), b(bb) {}
	Simple(int aa, int bb, int cc)		:a(aa), b(bb), c(cc) {}
	
	std::vector<int> getVals();

private:
	int a {-1};
	int b {-1};
	int c {-1};

	
};

simple.cpp
Kod:
#include <vector>
#include "simple.h"

Simple::Simple {
}

std::vector<int> Simple::getVals(){
	std::vector<int> vals{};
	vals.push_back(a);
	vals.push_back(b);
	vals.push_back(c);
	return vals;
}

simple_test.cpp
Kod:
#include <vector>
#include "simple.h"

using std::cout;
using std::endl;


int main(){
	
	Simple simpX = Simple();
	Simple simpA;
	Simple simpC = Simple(1,2,3);
	
	std::vector<int> valsX = simpX.getVals();
	std::vector<int> valsA = simpA.getVals();
	std::vector<int> valsC = simpC.getVals();

	cout << "x1: " << valsX[1] << " ";
	cout << " x2: " << valsX[0] << " ";
	cout << " x3: " << valsX[2] << " " << endl;
	
	cout << "a1: " << valsA[1] << " ";
	cout << " a2: " << valsA[0] << " ";
	cout << " a3: " << valsA[2] << " " << endl;

	cout << "c1: " << valsC[0] << " ";
	cout << " c2: " << valsC[1] << " ";
	cout << " c3: " << valsC[2] << " " << endl;
	
	
	return 0;
}
Citera
2020-12-03, 00:30
  #10
Medlem
kaks avatar
Du måste kompilera både simple.cpp och simple_test.cpp och länka ihop dem.
Citera
2020-12-03, 01:06
  #11
Medlem
Citat:
Ursprungligen postat av kak
Du måste kompilera både simple.cpp och simple_test.cpp och länka ihop dem.
Är det kanske där jag gör helt fel då =/
Använder en make-fil som jag modifierat med namnen på mina filer, men kanske skriver helt fel ändå.

Detta borde fungera annars kan man tycka?:

Kod:
g++ -std=c++11 -c simple.cpp
g++ -std=c++11 -c simple_test.cpp
g++ -o test simple_test.o simple.o
./test

Well, nu får jag detta felmeddelandet i stället:
simple.cpp:4:1: error: ‘Simple::Simple’ names the constructor, not the type
4 | Simple::Simple {
__________________
Senast redigerad av dagsvag 2020-12-03 kl. 01:12.
Citera
2020-12-03, 09:08
  #12
Medlem
kaks avatar
Citat:
Ursprungligen postat av dagsvag
Är det kanske där jag gör helt fel då =/
Använder en make-fil som jag modifierat med namnen på mina filer, men kanske skriver helt fel ändå.

Detta borde fungera annars kan man tycka?:

Kod:
g++ -std=c++11 -c simple.cpp
g++ -std=c++11 -c simple_test.cpp
g++ -o test simple_test.o simple.o
./test

Well, nu får jag detta felmeddelandet i stället:
simple.cpp:4:1: error: ‘Simple::Simple’ names the constructor, not the type
4 | Simple::Simple {
Ta bort
Kod:
Simple::Simple {

Vet inte vad du försöker göra, men det där betyder inget i C++.
Du bör även inkludera <vector> i Simple.h.
Headers ska inkludera vad de själva behöver, inte förlita sig på att någon annan inkluderat rätt headers först.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback