2013-05-05 79 views
1

我想寫一個處理矩陣和數組的程序。因此,我寫了下面的代碼:爲什麼我的C++程序不能編譯(「未定義的引用」)?

Array.h

#ifndef _ARRAY_H_ 
#define _ARRAY_H_ 

class Array{ 
    private: 
     int * data; 
     int length; 

public: 
    Array(); 
    Array(int size); 
    ~Array(); 

    void set(int pos, int value); 
    int get(int pos); 
    void print(); 

    /*works only for arrays of length 9*/ 
    static int find_max(int data[]); 
}; 
#endif 

Array.cpp

#include <iostream> 
#include <stdlib.h> 
#include <string.h> 
#include "Array.h" 

using namespace std; 

Array::Array(){ 
    Array(10); 
} 

Array::Array(int size){ 
    data = new int[size]; 
    memset(data, 0, sizeof(data)); 
    length = size; 
} 

Array::~Array(){ 
    delete [] data; 
} 

... 

/*works only for arrays of length 9*/ 
int Array::find_max(int data[]){ 
    int max = data[0]; 

    for(int i = 1; i < 9; i++){ 
     if(data[i] > max) max = data[i]; 
    } 

    return max; 
} 

Matrix.h

#ifndef _MATRIX_H_ 
#define _MATRIX_H_ 
#include "Array.h" 

class Matrix{ 

    private: 
     Array * data; 
     int height; 
     int width; 

    public: 
     Matrix(); 
     Matrix(int _height, int _width); 
     ~Matrix(); 

     void set(int h, int w, int value); 
     int get(int h, int w); 
     void print(); 
}; 

#endif 

Matrix.cpp

#include <iostream> 
#include <stdlib.h> 
#include <string.h> 
#include "Matrix.h" 

using namespace std; 

Matrix::Matrix(){ 
    Matrix(10, 10); 
} 

Matrix::Matrix(int _height, int _width){ 
    height = _height; 
    width = _width; 

    data = (Array*)malloc(sizeof(Array)*height); 

    for(int i = 0; i < height; i++){ 
     Array * row = new Array(width); 
     *(data + i) = *row; 
    } 
} 

... 

void Matrix::print(){ 
    for(int i = 0; i < height; i++){ 
     Array row = *(data + i); 
     row.print(); 
    } 
    return; 
} 

的main.cpp

#include <iostream> 
#include <stdlib.h> 
#include <string.h> 
#include "Array.h" 
#include "Matrix.h" 

using namespace std; 

int main(int argc, char** argv){ 
    if(argc != 3){ 
     cout << "usage: " << argv[0] << " <m> x <n>" << endl; 
    } 

    int m = atoi(argv[1]); 
    int n = atoi(argv[2]); 

    Matrix myMatrix(m, n); 

    /*fill matrix randomly*/ 
    int guess, minus; 
    srand(time(NULL)); 

    for(int r = 0; r < m; r++){ 
     for(int c = 0; c < n; c++){ 
      guess = rand() % 1001; 
      minus = rand() % 2; 

      if(minus == 0) guess *= -1; 
      myMatrix.set(r, c, guess);; 

     } 
    } 

    cout << "randomly created matrix" << endl; 
    myMatrix.print(); 

    /*find local maximum and print it in another matrix*/ 
    Matrix localMaxMatrix(m, n); 

    for(int r = 0; r < m; r++){ 
     for(int c = 0; c < n; c++){ 
      /*correct access is ensured within get method*/ 
      int values[] = {myMatrix.get(r-1, c-1), 
          myMatrix.get(r-1, c), 
          myMatrix.get(r-1, c+1), 
          myMatrix.get(r, c-1), 
          myMatrix.get(r, c), 
          myMatrix.get(r, c+1), 
          myMatrix.get(r+1, c-1), 
          myMatrix.get(r+1, c), 
          myMatrix.get(r+1, c+1)}; 
      localMaxMatrix.set(r, c, Array::find_max(values)); 
     } 
    } 

    cout << "----------------------------------------" << endl; 
    cout << "local max for each entry of above matrix" << endl; 
    localMaxMatrix.print(); 

    return 0; 
} 

c++ -Wall -pedantic -o matrix Array.cpp Matrix.cpp結果編譯它下面的編譯錯誤:

/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../libcygwin.a(libcmain.o): In function 'main': /usr/src/debug/cygwin-1.7.17-1/winsup/cygwin/lib/libcmain.c:39: undefined reference to '[email protected]'

什麼是問題我的代碼以及我應該如何編寫正確填寫我的文件(不使用任何makefile)? 謝謝!

+1

我想你忘記把Array.cpp和Matrix.cpp一起添加的main.cpp。 while編譯字符串應該像'C++ -Wall -pedantic -o matrix Array.cpp Matrix.cpp main.cpp' – olevegard 2013-05-05 19:10:08

+3

閱讀並遵守它:http://stackoverflow.com/questions/228783/what-are關於使用下劃線的ac標識符 – chris 2013-05-05 19:24:48

+0

以* undefined reference *開頭的鏈接器錯誤表明錯誤消息中的符號不​​在可執行文件中:它或者沒有被定義,或者它沒有被定義被定義,但包含該符號的翻譯單元未被添加到鏈接器命令行中。 – 2013-05-05 19:41:29

回答

4

添加 「的main.cpp」 你的編譯行:

$ c++ -Wall -pedantic -o matrix Array.cpp Matrix.cpp main.cpp 
                ^^^^^^^^ 
+0

我怎麼能沒有看到這個?謝謝!它現在編譯,但我的程序中止,並在調試器中,我得到的消息「glibc檢測...程序接收到的信號SIGABRT,中止。0xb7fdd424在__kernel_vsyscall()」但我不知道這是否與方式我編譯了程序... – kaufmanu 2013-05-05 19:27:28

+1

@StringerBell:錯誤信息可能告訴你什麼是glibc檢測到的,哪些是錯誤中的重要一點。也就是說,它檢測到的東西是好的,但知道它檢測到的東西很重要,可以找出錯誤是什麼(很可能它檢測到了雙倍免費?)在您的程序中有幾個錯誤,但您應該單獨打開問題:例如,默認的'Array'構造函數不會做你可能認爲的事情(如果這是你所期望的,它不會將調用轉發給1參數構造函數) – 2013-05-05 19:42:59

+0

@DavidRodríguez-dribeas好的,謝謝你,我會有一個再看一遍,如果有必要,可以在單獨的問題中處理這些問題。 – kaufmanu 2013-05-05 19:55:52

相關問題