LNK2005 и LNK1169 на объектах отладки

Я довольно подробно читал об этих двух ошибках, но, несмотря на все свои усилия, я не вижу здесь проблемы. Я абсолютно залил свой код защитниками заголовков, чтобы посмотреть, поможет ли это, без изменений в результате. вот каждый из файлов:
Mystring.cpp

#pragma once
#include "MyString.h"
#ifndef MYSTRING_CPP
#define MYSTRING_CPP

using namespace std;

MyString::MyString(char chars[]){
str = (char*) malloc(strlen(chars));
str = chars;
}

//etc, other methods as defined in header file

#endif

Mystring.h

#pragma once
#include <string.h>
#include <iostream>
#ifndef MYSTRING_H
#define MYSTRING_H
using namespace std;
class MyString {
protected:
char * str;
public:
~MyString();
MyString(char chars[]);
MyString(const char chars[]);
MyString();
int length();
void resize(int n, char c);
void clear();
bool empty();
void insert(int pos1, const MyString& str);
void insert (int pos1, const char* s);
void erase (int pos, int n);
int find(const MyString& str);
int find(const char* s);
int compare(const MyString& str);
int compare(const char* s);
const char* getStr() const;
MyString::MyString(const MyString &that);
MyString & operator=(const char chars[]);
MyString & operator=(const MyString& str);

};

#endif

MystringDerived.h

#pragma once
#include "MyString.cpp"#ifndef MYSTRINGDERIVED_H
#define MYSTRINGDERIVED_H
class MyStringDerived :
public MyString
{
public:

MyStringDerived(char chars[]);
bool operator>(MyString rhs);
bool operator>=(MyString rhs);
bool operator<(MyString rhs);
bool operator<=(MyString rhs);
bool operator==(MyString rhs);
bool operator!=(MyString rhs);
bool operator+(MyString rhs);
bool operator[](MyString rhs);
MyStringDerived(void);
~MyStringDerived(void);
};

#endif

MyStringDerived.cpp

    #pragma once
#include "MyStringDerived.h"#ifndef MYSTRINGDERIVED_CPP
#define MYSTRINGDERIVED_CPP

MyStringDerived::MyStringDerived(char * const)
{
}MyStringDerived::~MyStringDerived(void)
{
}
#endif

и ошибки, которые я получаю

    1>test.obj : error LNK2005: "public: int __thiscall MyString::length(void)" (?length@MyString@@QAEHXZ) already defined in MyString.obj
1>test.obj : error LNK2005: "public: void __thiscall MyString::resize(int,char)" (?resize@MyString@@QAEXHD@Z) already defined in MyString.obj
1>C:\Users\Arthur\Documents\Visual Studio 2012\Projects\Project1\Debug\Project2.exe : fatal error LNK1169: one or more multiply defined symbols found

Существуют сотни строк ошибок, которые выглядят так. С тем, как я организовал свои включения, я определенно не понимаю, как я могу получить несколько копий. Что-то еще мне не хватает? Любые идеи приветствуются. Это домашнее задание (очевидно), поэтому я определенно хочу понять проблему, когда закончу здесь. Никто из тех, кому я это показал, не понял, что я делаю неправильно.

Спасибо!

Забыл включить test.cpp. это так просто на данный момент:

MyStringDerived m = «test»; соиЬ<< m.getStr (); GetChar (); вернуть
0;

0

Решение

Я думаю, что проблема в строке 2 MyStringDerived.h. Вы включаете MyString.cpp, когда вы должны включать MyString.h

[Обновить]

То, как вы это закодировали, все определения MyString.cpp скомпилированы в файл MyString.obj — это хорошо и так и должно быть. К сожалению, из-за вашего #include все определения MyString.cpp также появляются в MyDerivedString.obj

Чтобы действительно понять, почему это проблема, вам нужно потратить некоторое время и изучить разницу между декларацией и определением — просто Google «декларация c ++ против определения». Вот статья, которая может быть полезной. http://www.cprogramming.com/declare_vs_define.html

Все, что «объявлено», можно снова и снова включать в программу без какого-либо вреда. Все, что определено, должно появляться один раз и только один раз во всех объектных файлах, связанных с приложением.

Это приводит к следующим общим рекомендациям:

Заголовочный файл (.h) должен содержать только объявления. Он не должен содержать никаких определений. Только .cpp файлы могут содержать определения. Тогда вы должны убедиться, что никогда не #include файл .cpp. Это самый простой способ убедиться, что у вас никогда не будет повторяющихся определений во время ссылки.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]