1

C ++では、抽象クラスAがあります。

 class A
 {
 public:
    A(){}
    virtual ~A(){}
    virtual void out(std::ofstream& outFile) = 0;
    virtual void in(std::ifstream& inFile) = 0;
};    

そして、仮想メソッドを使用したいBクラス:

class B : public A
{
public:
   B();              
   double angle;
   int index;


   virtual void out(std::ofstream& outFile);
   virtual void in(std::ifstream& inFile);

};

ここに質問があります:仮想メソッドで(int index)のようなBクラス変数を使用したい:

virtual void out(std::ofstrea& outFile)
{
    outFile<< index << angle;       
}

ここで、角度とインデックスがこのスコープで宣言されていないというコンパイラエラーが発生します。この変数はクラスAで宣言されていないため、ある程度論理的です。仮想メソッドで変数の角度とインデックスにアクセスするにはどうすればよいですか?

ご協力いただきありがとうございます。

4

5 に答える 5

1

関数をラインから外して定義するときは、次のようなものを使用します。

void B::out(std::ofstream& outFile)
{
    outFile<< index << angle;       
}

関数が仮想であるかどうかに関係なく、それぞれのクラスのすべてのメンバーは、メンバー関数でアクセスできます。

std::ofstreamデータの読み取りまたは書き込み関数について話しているので、またはの特定の詳細を実際に使用する必要がない限りstd::ifstream、たとえば、を使用するopen()場合は、おそらく渡すstd::ostreamstd::istream参照する必要があります。このようにして、関数はさまざまなストリームストリームタイプ(例、、など)でも使用できstd::ostringstreamますstd::istringstream

于 2012-09-30T13:41:44.640 に答える
1

クラスの外部でメソッドを実装している場合は、そのメソッドにマークを付けず、virtualその名前を修飾します。

void B::out(std::ofstrea& outFile)
{
    outFile<< index << angle;       
}
于 2012-09-30T13:41:47.250 に答える
0

クラス宣言で関数本体を記述していない限り、メンバー関数名の前にクラス名を付ける必要があります。

void B::out(std::ofstream& out)
{
   out << index << angle;
}

ちなみに、どのような正確なエラーが発生しましたか。正確なエラーコードを投稿できれば、これははるかに簡単です。

于 2012-09-30T13:41:27.123 に答える
0

メンバー関数定義の前にクラス名がありません。

void B::out(std::ofstrea& outFile)  // Virtual keyword is optional in defintion.
{
    // ...
}
于 2012-09-30T13:41:30.167 に答える
0

cppファイルでクラスメソッドを定義するときは、次のようにスコープとしてクラス名を指定する必要があります。

void B::out(std::ofstrea& outFile)
{
outFile<< index << angle;       
}
于 2012-09-30T13:41:56.360 に答える