C ++ наследование конструктора не работает правильно - PullRequest
0 голосов
/ 24 ноября 2011

Это заголовок зависимого класса

#ifndef TransHeader
#define TransHeader
#include <string>
#include "CipherHeader.h"

using namespace std;
class Trans : public Cipher {
    public:
    Trans(string filenameIn);
    const static int MAXSIZE = 10000;
    void createArray();
    void transEncrypt();
    void transDecrypt();


    private:
        //string Key;
        //string inputData;
        char dataArray[MAXSIZE][MAXSIZE];


};

#endif

Это унаследованный заголовок

#ifndef CipherHeader
#define CipherHeader
#include <string>
using namespace std;

class Cipher {
    public:
        const static int MAXSIZE = 10000;
        Cipher(string filenameIn);
        void getKey();
        void flagHandle(string);
        string Key;
        string inputData;
        string filename;
        string flags;

        string readFile();
        void writeFile();
    private:




};

#endif

Проблема в том, что после вызова базового конструктора

Trans::Trans(string filenameIn) : Cipher(filenameIn) {}

Я не могу вызвать конструктор в обычном файле, например:

#include "Trans.cpp"

int main() {
string a  = "asdf";
Trans *c = new Trans(a);

}

Это приводит к этой ошибке:

g++ test.cpp -o test.out
/tmp/ccbuqMYr.o: In function `Trans::Trans(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
test.cpp:(.text+0x35): undefined reference to `Cipher::Cipher(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
/tmp/ccbuqMYr.o: In function `Trans::Trans(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
test.cpp:(.text+0xa5): undefined reference to `Cipher::Cipher(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status

замена Trans на Cipher работает просто отлично и работает. Я перепробовал все, что знаю, слишком много гуглил и не могу понять эту ошибку. Другие проблемы дизайна, т. Д. Будут рассмотрены позже, это моя главная проблема. Пожалуйста, помогите.

РЕДАКТИРОВАТЬ :: определение шифра

Cipher::Cipher(string filenameIn) {

filename = filenameIn;

readFile();
getKey();

}

Ответы [ 2 ]

3 голосов
/ 24 ноября 2011

Хорошо, правило 1 - никогда не помещайте выражение 'using' в заголовочный файл!; -)

Хорошо, вам нужно вызвать конструктор базового класса.

Итак:

Trans::Trans(const std::string &f) // notice pass by reference
    :Cipher(f)
{
}
1 голос
/ 24 ноября 2011

Вам нужны все исходные файлы в сборке:

g++ test.cpp trans.cpp cipher.cpp -o test

Это даст вам новую ошибку, поскольку вы включаете trans.cpp исходный файл из test.cpp, а не файл заголовка- исправить это, и он должен строить без дальнейших проблем.

...