【发布时间】:2011-11-04 14:50:36
【问题描述】:
我正在尝试解决有关外部定义构造函数的编译问题。
这里有 2 个有这个问题的类:
//Username.h
#ifndef USERNAME_H
#define USERNAME_H
#include <string>
using namespace std;
class Username{
private:
string Name;
public:
Username(string = "");
string getName() const;
void setName(string);
};
#endif
...
//Username.cpp
#include "Username.h"
Username::Username(string n):Name(n){}
string Username::getName() const{return Name;}
void Username::setName(string n){Name = n;}
...
//User.h
#ifndef USER_H
#define USER_H
#include <string>
#include "Username.h"
using namespace std;
class User{
protected:
Username* UserUsername;
public:
User(string s);
virtual ~User();
Username* getUsername() const;
void setUsername(Username*);
};
#endif
...
//User.cpp
#include "User.h"
User::User(string s):UserUsername(new Username(s)){}
User::~User(){}
Username* User::getUsername() const{return UserUsername;}
void User::setUsername(Username* u){UserUsername=u;}
int main(){return 0;}
如果我使用“g++ User.cpp”进行编译,我会收到此错误:
/tmp/ccEmWmfl.o: In function `User::User(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
User.cpp:(.text+0x3e): undefined reference to `Username::Username(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status
如果我使用“g++ User.cpp Username.cpp -o main”或者如果我使用内联构造函数/析构函数,我不会出错。
这些类非常简单,但我还有很多需要编译的类。
我是使用 g++ 在 Ubuntu shell 中编译的新手,所以请有人帮我理解一下吗?
【问题讨论】:
-
请注意,在头文件中包含
using namespace XXX被认为是非常糟糕的做法。 -
为什么不使用 Makefile 或者更方便的build system?