Я довольно подробно читал об этих двух ошибках, но, несмотря на все свои усилия, я не вижу здесь проблемы. Я абсолютно залил свой код защитниками заголовков, чтобы посмотреть, поможет ли это, без изменений в результате. вот каждый из файлов:
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;
Я думаю, что проблема в строке 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. Это самый простой способ убедиться, что у вас никогда не будет повторяющихся определений во время ссылки.
Других решений пока нет …