我正在尝试探索命名空间并尝试按照我在C中的方式创建示例库。我从未在C ++中这样做过,所以这就是我正在做的事情。这是我的代码工作正常,我想放在单独的文件中。
#include <iostream>
#include <string>
namespace TCS{
class employee{
int uID;
std::string name;
public:
employee(const int& uId, const std::string& name)
{
this->uID=uId;
(this->name).assign(name);
}
int getID()
{
return uID;
}
std::string getName()
{
return name;
}
};
}
using namespace std;
class employee{
int uID;
string name;
public:
employee(const int& uId, const string& name)
{
this->uID=uId;
(this->name).assign(name);
}
int getID()
{
return uID;
}
string getName()
{
return name;
}
};
int main()
{
employee TechMEmp1(1,"Andrew");
TCS::employee TCSEmp1(1,"Thomas");
cout << "Tech M Employee is :- ID : " << TechMEmp1.getID() << " Name : "
<< TechMEmp1.getName() << endl;
cout << "TCS Employee is :- ID : " << TCSEmp1.getID() << " Name : "
<< TCSEmp1.getName() << endl;
return 0;
}
现在我只是试图复制我将内容放在C中的单独文件中的方式。我使用内容编写了一个文件TCS.h:
#ifndef TCS_HEADER
#define TCS_HEADER
namespace TCS{
class employee{
int uID;
std::string name;
public:
employee(const int& uId, const std::string& name);
int getID();
std::string getName();
};
}
#endif
另一个文件:内容为
的TCSNamespace.cpp#include "TCS.h"
#include <string>
TCS::employee(const int& uId, const std::string& name);
{
this->uID=uId;
(this->name).assign(name);
}
int TCS::getID();
{
return uID;
}
std::string TCS::getName();
{
return name;
}
我的最终文件包含main:
#include <iostream>
#include <string>
#include "TCS.h"
using namespace std;
class employee{
int uID;
string name;
public:
employee(const int& uId, const string& name)
{
this->uID=uId;
(this->name).assign(name);
}
int getID()
{
return uID;
}
string getName()
{
return name;
}
};
int main()
{
employee TechMEmp1(1,"Andrew Thomas");
TCS::employee TCSEmp1(1,"Thomas Hula");
cout << "Tech M Employee is :- ID : " << TechMEmp1.getID() << " Name : "
<< TechMEmp1.getName() << endl;
cout << "TCS Employee is :- ID : " << TCSEmp1.getID() << " Name : "
<< TCSEmp1.getName() << endl;
return 0;
}
当我输入命令时,我正在使用Cygwin并尝试单独编译文件: g ++ -Wall -c TCSNamespace.cpp(我认为这将编译我的TCSNamespace.cpp,它编译c文件的方式) 我明白了:
$ g++ -Wall -c TCSNamespace.cpp
In file included from TCSNamespace.cpp:1:
TCS.h:6: error: using-declaration for non-member at class scope
TCS.h:6: error: expected `;' before "name"
TCS.h:8: error: expected unqualified-id before '&' token
TCS.h:8: error: expected `,' or `...' before '&' token
TCS.h:8: error: ISO C++ forbids declaration of `parameter' with no type
TCS.h:10: error: using-declaration for non-member at class scope
TCS.h:10: error: expected `;' before "getName"
TCSNamespace.cpp:4: error: expected constructor, destructor, or type conversion before ';' token
TCSNamespace.cpp:5: error: expected unqualified-id before '{' token
TCSNamespace.cpp:5: error: expected `,' or `;' before '{' token
TCSNamespace.cpp:9: error: `int TCS::getID()' should have been declared inside `TCS'
TCSNamespace.cpp:10: error: expected unqualified-id before '{' token
TCSNamespace.cpp:10: error: expected `,' or `;' before '{' token
TCSNamespace.cpp:13: error: `std::string TCS::getName()' should have been declared inside `TCS'
TCSNamespace.cpp:14: error: expected unqualified-id before '{' token
TCSNamespace.cpp:14: error: expected `,' or `;' before '{' token
我打算做的是单独编译TCSNamespace.cpp和Namespace.cpp,然后将它们链接起来以获得可执行文件和以下命令:
g++ -Wall -c TCSNamespace.cpp
g++ -Wall -c Namespace.cpp
gcc TCSNamespace.o Namespace.o –o Namespace
有谁能告诉我哪里出错了?我也想知道用C语言在C ++中创建“TCS.h”是一种很好的做法,因为C ++使用了头文件的类型。
由于
答案 0 :(得分:3)
我看到的一个问题是,您没有将.cpp文件中的函数声明给类员工的成员。您需要使用命名空间包装整个.cpp文件,然后让每个成员函数前面都有类名。你也可以在每个函数之前加上命名空间TCS::employee::employee(...)
,而不是像下面那样用命名空间包装整个代码,但是这可能会变得非常麻烦,不断地写出来。还要注意函数定义中的分号。
#include "TCS.h"
#include <string>
namespace TCS {
employee::employee(const int& uId, const std::string& name) // <-- remove semicolon
{
this->uID=uId;
(this->name).assign(name);
}
int employee::getID() // <-- remove semicolon
{
return uID;
}
std::string employee::getName() // <-- remove semicolon
{
return name;
}
}
您还需要从函数定义的末尾删除分号,如上所示。
我还建议在TCS.h中包含string
,因为包含TCS.h的任何文件都必须包含字符串include。
答案 1 :(得分:2)
TCS.h需要包含<string>
标题
TCSNamespace.cpp应为
#include "TCS.h"
#include <string>
namespace TCS {
employee::employee(const int& uId, const std::string& name)
{
this->uID=uId;
(this->name).assign(name);
}
int employee::getID()
{
return uID;
}
std::string employee::getName()
{
return name;
}
}
在您的情况下 - 您没有指定,该函数是类的成员。
答案 2 :(得分:2)
TCS.h
需要#include <string>
。
目前,TCS.h
之前已包含<string>
,因此std::string
的声明在处理name
时未知。
#ifndef TCS_HEADER
#define TCS_HEADER
#include <string>
namespace TCS{
class employee{
int uID;
std::string name;
public:
employee(const int& uId, const std::string& name);
int getID();
std::string getName();
};
}
#endif
另外,@ ForEverR在.cpp
内容上打败了我,所以我会注意到你可以写:
TCS::employee::employee(const int& uId, const std::string& name);
{
this->uID=uId;
(this->name).assign(name);
}
最后:
我也想知道用C ++创建“TCS.h”的方式 C,这是一种很好的做法,因为C ++使用标题类型。
答案:是的。