0

Screen.h にこのクラス (完全なコード) があります。

#include <string>
#include <iostream>

class Screen {
    using pos = std::string::size_type;
private:
    pos cursor = 0;
    pos height = 0, width = 0;
    std::string contents;
public:
    Screen() = default; // needed because Screen has another constructor

    Screen(pos ht, pos wd) : Screen(ht, wd, ' ') {}

    Screen(pos ht, pos wd, char c): height(ht), width(wd),
                                    contents(ht * wd, c) { }

    char get() const {
        return contents[cursor];
        }

    Screen& move(pos r, pos c);

    inline char get(pos ht, pos wd) const; // explicitly inline


    Screen& set(char);

    const Screen& display(std::ostream&) const;

    Screen& display(std::ostream&);

private:
        void doDisplay(std::ostream&) const;
};

および Screen.cpp での実装:

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

char Screen::get(pos r, pos c) const // declared as inline in the class
{
    pos row = r * width;      // compute row location
    return contents[row + c]; // return character at the given column
}

 inline Screen& Screen::move(pos r, pos c) {
    pos row = r * width;
    cursor = row + c;
    return *this;
}

Screen& Screen::set(char c) {
    contents[cursor] = c;
    return *this;
}

Screen& Screen::display(std::ostream& outputStream) {
    doDisplay(outputStream);
    return *this;
}

const Screen& Screen::display(std::ostream& outputStream) const {
    doDisplay(outputStream);
    return *this;
}

void Screen::doDisplay(std::ostream& outputStream) const {
    for (unsigned h = 0; h < height; ++h) {
            for (unsigned w = 0; w < width; ++w) {
                outputStream << contents[h*w];
            }
            outputStream << std::endl;
    }
}

私のメインファイル:

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

int main() {
    Screen myScreen(5, 5, 'X');
    myScreen.move(0,4).set('#').display(std::cout);
    std::cout << std::endl;

    int returnCode = EXIT_SUCCESS;
    return returnCode;
}

これにより、次のリンカー エラーが生成されます: `Screen::move(unsigned long long, unsigned long long)' への未定義参照

Screen::move から「インライン」を削除すると動作しますが、どういうわけか 0,4 の文字が変更されません...何が機能していないのかよくわかりません。gcc コンパイラで Code::Blocks を使用しています。

編集:「移動」メソッドの定義から「インライン」を削除すると、すべて正常に動作します。しかし、私の質問は、Screen.cpp で「インライン」を指定できないのはなぜですか?

4

2 に答える 2

0

cppファイルにインラインがあり、インラインを削除しても問題ありません。Screen::move 関数のことです。ヘッダー ファイルへの代替移動定義。

于 2013-08-11T12:21:07.527 に答える
0

*.h に入れるか、プライベートにして *cpp で排他的に使用します。

于 2013-08-11T12:35:27.787 に答える