Компоновщик Visual Studio 2010, поиск многозначно определенных символов (где это не должно) - PullRequest
1 голос
/ 20 апреля 2010

Я только начал с C ++, и, может быть, я что-то здесь не так делаю, но я в растерянности. Когда я пытаюсь построить решение, я получаю 4 LNK2005 таких ошибок:

error LNK2005: "public: double __thiscall Point::GetX(void)const " (?GetX@Point@@QBENXZ) already defined in CppSandbox.obj

(есть один для каждого метода get / set, и все они предположительно встречаются в Point.obj)

И, наконец, эта ошибка:

error LNK1169: one or more multiply defined symbols found

Что, как сообщается, происходит в CppSandbox.exe. Я не уверен, что является причиной этой ошибки - кажется, что это происходит, когда я строю или перестраиваю решение ... Честно говоря, действительно в растерянности.

Три файла ниже - это все, что я добавил к пустому проекту VS2010 по умолчанию (они полностью скопированы). Спасибо за любую помощь, которую вы можете предложить.

Point.h

class Point
{
public:
    Point() 
    { 
        x = 0; 
        y = 0; 
    };
    Point(double xv, double yv) 
    { 
        x = xv;
        y = yv; 
    };

    double GetX() const;
    void SetX(double nval);

    double GetY() const;
    void SetY(double nval);

    bool operator==(const Point &other)
    {
        return GetX() == other.GetX() && GetY() == other.GetY();
    }

    bool operator!=(const Point &other)
    {
        return !(*this == other);
    }

private:
    double x;
    double y;
};

Point.cpp

#include "Point.h"

double Point::GetX() const
{
    return x;
}

double Point::GetY() const
{
    return y;
}

void Point::SetX(double nv)
{
    x = nv;
}

void Point::SetY(double nv)
{
    y = nv;
}

CppSandbox.cpp

// CppSandbox.cpp : Defines the entry point for the console application.
//

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

int main()
{
    Point p(1, 2);
    Point q(1, 2);
    Point r(2, 3);

    if (p == q) std::cout << "P == Q";
    if (q == p) std::cout << "Equality is commutative";
    if (p == r || q == r) std::cout << "Equality is broken";

    return 0;
}

1 Ответ

8 голосов
/ 20 апреля 2010

Проблема в CppSandbox.cpp :

#include "Point.cpp"

Вы включаете файл cpp вместо заголовочного файла, поэтому его содержимое компилируется дважды, и поэтому все в нем определяется дважды. (Он компилируется один раз, когда Point.cpp компилируется, и второй раз, когда CppSandbox.cpp компилируется.)

Вы должны включить заголовочный файл в CppSandbox.cpp :

#include "Point.h"

Ваш заголовочный файл также должен иметь включать охрану .

...