0

このスニペット コードを見てみましょう:

class MyClass
{
public:
    int m_num;
    MyClass(int n) { m_num = n;}
}

このクラスのオブジェクトを次の方法で作成すると:

MyClass mc1(5);
MyClass mc2(mc1);

これはデフォルトのコピー コンストラクターを呼び出し、自動的に mc2.m_num = mc1.m_num ? を割り当てます。また、クラス内に次のようにインスタンスを作成する呼び出しがある場合:

MyClass mc3(*this);

これは、mc2 と同じようにデフォルトのコピー コンストラクターを呼び出します。 *これは、オブジェクト自体をコピーするだけです。

私が抱えている 2 番目の問題は、Microsoft Visual Studio 2013 でコードをコンパイルすることです。String クラスを作成しましたが、コンパイルしようとすると、何らかの理由で関数が既に定義されていることを示す多くのリンク エラーが発生します。文字列.h:

#pragma once
class String
{
private:
    char* m_szStr;
    unsigned int m_length;
public:
    String(const char*);
    explicit String(unsigned int);
    String(const String&);
    ~String();
    String& operator=(const String&);
    bool operator==(const String&) const;
    String operator+(const String&) const;
    operator const char*() const;
    int findStr(char*) const;
    int getLen() const;
    void copyStr(const char*);

};

文字列.cpp:

#include "stdafx.h"
#include "String.h"

String::String(const char* pch)
{
    m_szStr = NULL;
    copyStr(pch);
}

String::String(unsigned int len)
{
    m_length = len;
    m_szStr = new char[m_length];
}

String::String(const String& that)
{
    copyStr(that.m_szStr);
}

String::~String()
{
    delete[] m_szStr;
}

String& String::operator=(const String& that)
{
    copyStr(that.m_szStr);
    return *this;
}

bool String::operator==(const String& that) const
{

    if (m_length != that.m_length)
        return false;
    for (unsigned int i = 0; i < m_length; i++)
    {
        if (m_szStr[i] != that.m_szStr[i])
            return false;
    }
    return true;
}

String String::operator+(const String& that) const
{
    String temp(m_length + that.m_length - 1);
    unsigned int offset = m_length;
    for (unsigned int i = 0; i < that.m_length; i++)
    {
        temp.m_szStr[offset] = that.m_szStr[i];
    }
    return temp;
}

String::operator const char*() const
{
    return m_szStr;
}

int String::findStr(char* pch) const
{
    unsigned int offset = 0;
    unsigned int strIndex = -1;
    for (unsigned int i = 0; m_szStr[i] != NULL && pch[offset] != NULL; i++)
    {
        if (m_szStr[i] == pch[offset])
        {
            if (strIndex == -1)
                strIndex = i;
            offset++;
        }
        else
        {
            strIndex = -1;
            offset = 0;
        }
    }
    return strIndex;
}

int String::getLen() const
{
    unsigned int len = 0;
    for (unsigned int i = 0; m_szStr[i] != NULL; i++)
    {
        len++;
    }
    return len;
}

void String::copyStr(const char* pch)
{
    if (!m_szStr)
        delete[] m_szStr;
    unsigned int pchLen = 0;
    for (unsigned int i = 0; pch[i] != NULL; i++)
    {
        pchLen++;
    }
    m_length = pchLen;
    m_szStr = new char[m_length];
    for (unsigned int i = 0; i < m_length; i++)
    {
        m_szStr[i] = pch[i];
    }
}

コードファイル:

#include "stdafx.h"
#include <iostream>
#include "String.cpp"

using namespace std;


int _tmain(int argc, _TCHAR* argv[])s
{
    String s1("Hi!");
    String s2(5);
    s2 = "Hello, Hi!";
    const char* pch = static_cast<const char*>(s2);
    cout << pch << endl;
    return 0;
}

エラー:

Error   1   error LNK2005: "public: __thiscall String::String(class String const &)" (??0String@@QAE@ABV0@@Z) already defined in assignment4.obj    C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj    assignment4
Error   2   error LNK2005: "public: __thiscall String::String(unsigned int)" (??0String@@QAE@I@Z) already defined in assignment4.obj    C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj    assignment4
Error   3   error LNK2005: "public: __thiscall String::String(char const *)" (??0String@@QAE@PBD@Z) already defined in assignment4.obj  C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj    assignment4
Error   4   error LNK2005: "public: __thiscall String::~String(void)" (??1String@@QAE@XZ) already defined in assignment4.obj    C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj    assignment4
Error   5   error LNK2005: "public: class String & __thiscall String::operator=(class String const &)" (??4String@@QAEAAV0@ABV0@@Z) already defined in assignment4.obj  C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj    assignment4
Error   6   error LNK2005: "public: bool __thiscall String::operator==(class String const &)const " (??8String@@QBE_NABV0@@Z) already defined in assignment4.obj    C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj    assignment4
Error   7   error LNK2005: "public: __thiscall String::operator char const *(void)const " (??BString@@QBEPBDXZ) already defined in assignment4.obj  C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj    assignment4
Error   8   error LNK2005: "public: class String __thiscall String::operator+(class String const &)const " (??HString@@QBE?AV0@ABV0@@Z) already defined in assignment4.obj  C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj    assignment4
Error   9   error LNK2005: "public: void __thiscall String::copyStr(char const *)" (?copyStr@String@@QAEXPBD@Z) already defined in assignment4.obj  C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj    assignment4
Error   10  error LNK2005: "public: int __thiscall String::findStr(char *)const " (?findStr@String@@QBEHPAD@Z) already defined in assignment4.obj   C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj    assignment4
Error   11  error LNK2005: "public: int __thiscall String::getLen(void)const " (?getLen@String@@QBEHXZ) already defined in assignment4.obj  C:\Users\****\Desktop\C++ Programming\assignment4\assignment4\String.obj    assignment4
Error   12  error LNK1169: one or more multiply defined symbols found   C:\Users\****\Desktop\C++ Programming\assignment4\Debug\assignment4.exe 1   1   assignment4
4

1 に答える 1

2

メイン コード ファイルに次のように記述します。

#include "String.h"   // with .cpp you redefine everything !! 

現在、含まれていますString.cpp。したがって、メイン ファイルでは、String.cpp で既に定義したすべてを再定義します。これはコンパイルされますが、リンカは、String.obj と main.obj (「1 つの定義規則」) で String メンバー関数の定義を見つけるため、混乱します。

そして、あなたはすでにコピーコンストラクターの質問に答えています

于 2014-09-26T17:42:37.673 に答える