1

私は名前空間を探索し、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ファイルをcteatedしました:

#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;
            }

そして、メインを含む私の最終的なファイルは次のとおりです。

#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 (これにより、c ファイルをコンパイルする方法で TCSNamespace.cpp がコンパイルされると思います):

$ 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++ で "TCS.h" を作成するのと同じ方法で C++ を作成することも知りたいです。C++ はヘッダーのタイプを使用するため、それは良い習慣です。

ありがとう

4

3 に答える 3

3

私が見る 1 つの問題は、.cpp ファイル内の関数をクラス employee のメンバーに宣言していないことです。.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;
    }
}

また、上記のように、関数定義の末尾からセミコロンを削除する必要があります。

stringTCS.h をインクルードするファイルには文字列 include が必要なため、TCS.h にインクルードすることもお勧めします。

于 2013-04-22T05:38:19.703 に答える
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;
        }
}

あなたの場合、指定しませんが、関数はクラスのメンバーです。

于 2013-04-22T05:35:00.853 に答える
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 ++はヘッダーのタイプを使用するため、それは良い習慣です。

答え: はい。

于 2013-04-22T05:36:04.417 に答える