2017-09-12 71 views
-2

我正在學習C++並試圖一次性練習翻譯單元和其他東西,但是我收到了標題中列出的錯誤。這個程序是用於學習的目的,我試圖解釋每個頭文件和實現文件應該做什麼。LINKER ERROR LNK1169&LNK2005

-------- -------- CString.h

#ifndef CSTRING_H 
#define CSTRING_H 
#include <iostream> 

namespace w1 
{ 
class CString 
{ 
    public: 
     char mystring[]; 
     CString(char cstylestring[]); 
     void display(std::ostream &os); 
}; 

std::ostream &operator<< (std::ostream &os, CString &c) 
{ 
    c.display(os); 
    return os; 
} 
} 
#endif 

-------- -------- process.h原型用於處理功能

void process(char cstylestring[]); 

-------- -------- CString.cpp 要接收C風格串中的構造和通過取前三個字符,並存儲它截斷它在後來通過功能顯示器顯示()

#include <iostream> 
#include "CString.h" 
#define NUMBEROFCHARACTERS 3 

using namespace w1; 

w1::CString::CString(char stylestring[]) 
{ 
if (stylestring[0] == '\0') 
{ 
    mystring[0] = ' '; 
} 
else 
{ 
    for (int i = 0; i < NUMBEROFCHARACTERS; i++) 
    { 
     mystring[i] = stylestring[i]; 
    } 
} 
//strncpy(mystring, stylestring, NUMBEROFCHARACTERS); 
} 


void w1::CString::display(std::ostream &os) 
{ 
std::cout << mystring << std::endl; 
} 

-------- process.cpp --------接收一個C風格的字符串並創建一個CString對象,然後通過操作符重載顯示可能截斷的c風格字符串。

#include "process.h" 
#include "CString.h" 
#include <iostream> 

using namespace std; 

void process(char cstylestring[]) 
{ 
w1::CString obj(cstylestring); 
std::cout << obj << std::endl; 
} 

-------- main.cpp --------通過向處理函數發送C風格字符串來測試目的。因爲你在頭文件是從多個源文件包括定義它

#include <iostream> 
#include "process.h" 

using namespace std; 

int main() 
{ 
char themainstring[] = "hiiiii"; 
process(themainstring); 
return 0; 
} 
+1

你是如何構建它的? – yacc

+0

我點擊調試器試圖運行main.cpp – TheNubProgrammer

+0

什麼是鏈接錯誤信息? – Phil1970

回答

0

<<操作定義多個時間。

要麼添加inline修飾符,以便只保留一個副本或將定義移動到一個源文件中(並且只保留頭文件中的聲明)。

正如我在我的評論中提到的那樣,程序在運行時會崩潰,因爲沒有爲mystring分配內存。如果它應該是4個字符長的最大值,那麼你可以簡單地在方括號內添加4,如:

char mystring[4]; 

否則,如果你需要可變大小,然後使用類似std::vector可能是有意義的,你會避免明確內存管理。

更新

我原來的答案是完整的,但因爲你似乎不正確地理解它,我已經添加了額外的細節...

我說了如下定義的在CString.h

std::ostream &operator<< (std::ostream &os, CString &c) 
{ 
    c.display(os); 
    return os; 
} 

兩個process.cppmain.cpp包括文件CString.h其中包含該定義兩次(一次編譯這兩個文件中的每一個)。

+0

等等,當你提到我多次定義它。這是我定義它的兩個場景嗎? – TheNubProgrammer

+0

void w1 :: CString :: display(std :: ostream&os) { \t std :: cout << mystring << std :: endl; } – TheNubProgrammer

+0

std :: cout << obj << std :: endl; – TheNubProgrammer