0

私は uni の C プログラミングを行っていて、暇なときに C++ に移行し、別のファイルなどのクラスから始めようとしていますが、プロジェクトを作成しようとするといくつかの問題が発生します。次のメイクファイルを使用しています

EXEC = main
OBJS = main.o Bunny.o Name.o Board.o
CC = g++

CFLAGS = -Wall -Wextra -Werror
LIBS = 
LDFLAGS = 


$(EXEC): $(OBJS)
    $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)



.PHONY: clean

clean: 
    rm -f $(EXEC) $(OBJS) 
run:
    ./$(EXEC)

これは私の C のバージョンを変更しただけなので、そうかもしれません。関連する他のファイルは次のとおりです。

main.cpp

#include <iostream>

#include "Name.hpp"
#include "definitions.hpp"

int main() {

    Name nameContainer;

    nameContainer.initMaleNameValidArray(); 

    std::cout << "Got to just before the return!\n" << std::endl;

    return 0;
}

名前.cpp

#include <iostream>
#include <fstream>
#include <string>
#include "definitions.hpp"

class Name{
    public:
        void initFemaleNameArray() {
            std::ifstream myReadFile;
            myReadFile.open("girlsnames.txt");
            char output[100];
            if (myReadFile.is_open()) {
                while (!myReadFile.eof()) {
                    myReadFile >> output;
                    std::cout<<output;
                }
            }
            myReadFile.close();
        }

        void initMaleNameArray() {

        }

        void initFemaleNameValidArray() {
            static int femaleValidArray[GIRLS_NAMES] = {0};
        }

        void initMaleNameValidArray() {
            static int MaleValidArray[GIRLS_NAMES] = {0};
        }

        void freeAFemaleName(std::string name);

        void freeAMaleName(std::string name);

        std::string returnFreeFemaleName();

        std::string returnFreeMaleName();

    private:
        std::string femaleNameArray[GIRLS_NAMES];

        std::string maleNameArray[BOYS_NAMES];

        int femaleValidArray[GIRLS_NAMES];

        int maleValidArray[BOYS_NAMES];
};

名前.hpp

#ifndef NAME_HPP
#define NAME_HPP

#include "definitions.hpp"

class Name{
    public:
        void initFemaleNameArray();

        void initMaleNameArray();

        void initFemaleNameValidArray();

        void initMaleNameValidArray();

        void freeAFemaleName(std::string name);

        void freeAMaleName(std::string name);

        std::string returnFreeFemaleName();

        std::string returnFreeMaleName();

    private:
        std::string femaleNameArray[GIRLS_NAMES];

        std::string maleNameArray[BOYS_NAMES];

        int femaleValidArray[GIRLS_NAMES];

        int maleValidArray[BOYS_NAMES];
};

#endif

そして、makeの実行時に表示されるエラーは次のとおりです。

mark@Mark-Linux:~/Documents/Misc/C++/Bunny$ make
g++    -c -o main.o main.cpp
g++    -c -o Bunny.o Bunny.cpp
g++    -c -o Name.o Name.cpp
g++    -c -o Board.o Board.cpp
g++  -o main main.o Bunny.o Name.o Board.o 
main.o: In function `main':
main.cpp:(.text+0x26): undefined reference to `Name::initFemaleNameArray()'
collect2: ld returned 1 exit status
make: *** [main] Error 1

現時点では、別のファイルでクラスのメソッドを使用できるかどうかを確認しようとしているため、コードが不完全です。

テキストの壁については申し訳ありませんが、私は本当に困惑しているので、誰かがアドバイスを提供できれば大歓迎です.

4

2 に答える 2

3

name.hpp では Name クラスを定義していますが、これで問題ありません。しかし、name.cpp では、そのクラスを再度定義しています。これはあなたが望むものではありません。name.cpp に関数を実装させる必要があります。それは次のようになります。

#include <iostream>
#include <fstream>
#include <string>
#include "definitions.hpp"

#include "name.hpp"

void Name::initFemaleNameArray() {
    std::ifstream myReadFile;
    myReadFile.open("girlsnames.txt");
    char output[100];
    if (myReadFile.is_open()) {
        while (!myReadFile.eof()) {
            myReadFile >> output;
            std::cout<<output;
        }
    }
    myReadFile.close();
}

void Name::initMaleNameArray() {}

void Name::initFemaleNameValidArray() {
    // This is wrong, too. This creates a new array
    //static int femaleValidArray[GIRLS_NAMES] = {0};
    // You want this:
    memset(femaleValidArray, 0, sizeof(femaleValidArray));
}

void Name::initMaleNameValidArray() {
    //static int MaleValidArray[GIRLS_NAMES] = {0};
    memset(MaleValidArray, 0, sizeof(MaleValidArray));
}

void Name::freeAFemaleName(std::string name) {}
void Name::freeAMaleName(std::string name) {}
std::string Name::returnFreeFemaleName() {}
std::string Name::returnFreeMaleName() {}
于 2012-10-16T12:55:00.113 に答える
1

Name.cpp と Name.hpp は実際には別々のクラスを宣言していますが、これはおそらく未定義の動作です。代わりに、Name.cpp は次のようになります。

#include <iostream>
#include <fstream>
#include <string>
#include "Name.hpp"

void Name::initFemaleNameArray() {
    std::ifstream myReadFile;

于 2012-10-16T12:52:42.933 に答える