2016-09-14 4 views
0

宿題に関しては、私はスケルトンクラスを提供し、ソースファイルのヘッダーから関数を実装するように指示しました。私はヘッダーを変更することが許されていません。実装ファイルにメンバー関数を追加する

しかし、実際にクラスに追加したい機能があります(operator()関数)。ヘッダーを変更せずにクラスの一部として宣言するにはどうすればよいですか?

フレンド機能を追加できません(ヘッダーのクラス定義を変更する必要があります)。私はソースの一番上にそれを実装することはできません(アウトラインの定義は一致しません...)。クラストップを再宣言することはできません(クラスの再定義)。

これも可能ですか?これを行うと、関数本体をコード内の4つの異なる場所にコピーする手間が省けます。

FYI、円、二重にリンクされたリストのアクセサーです。演算子[]はリスト要素の要素にアクセスするために使用され、代わりにリスト要素のポインタを返すアクセサが必要です。参考のため、事業者は次のようになります。

// CANT CHANGE THIS, ITS IN THE HEADER 
Elem& operator[](int i) const; 

// THIS IS WHAT I WANT THOUGH 
// ITS NOT IN THE HEADER, SO I CANT USE IT 
CNode * CircleList::operator()(int i) { 

    CNode * n = this->header->next; 

    if(i < 0) { 

     while(i < 0) { 
      n = (n->prev == this->header) ? (n->prev->prev) : (n->prev); 
      ++i; 
     } 

    } else if(i > 0) { 

     while(i > 0) { 
      n = (n->next == this->header) ? (n->next->next) : (n->next); 
      --i; 
     } 

    } 

    return n; 

} 

問題のヘッダ(の大部分):

#include "point.h" 
#include <stdlib.h> 
#include <stdio.h> 

typedef Point Elem; 
class CNode{ 
private: 
    Elem elem; 
    CNode * next; 
    CNode * prev; 

    friend class CircleList; 
}; 

class CircleList { 
public: 
    CircleList(); 
    ~CircleList(); 

    Elem& operator[](int i) const; 
    void setElemAt (int i, const Elem newElem) const; 
private: 
    CNode * header; 
    int _size; 
}; 
しかし
+4

申し訳ありませんが、できません。 – AndyG

+1

ヘッダーを表示できますか? 'header'が保護されているか公開されている場合、継承を使ってこの問題を回避できます。編集:それはまた、テストファイルでポインタの多態的な使用が必要になります。 – AndyG

+1

ヘッダーの** anything **は変更できません。まあ、あまりにも悪い... – DeiDei

答えて

1

、私は本当にクラスに追加したい機能があります( operator()機能)。ヘッダーを変更せずにクラスの一部として宣言するにはどうすればよいですか?

基本的にはできません。あなたは何ができるか

のいずれかです:

  • は、クラスから派生し、そこにあなたのoperator()を追加します。もちろん、他のコードが元のクラスを値セマンティクスで使用しなければならない場合は、これは機能しません。
  • クラスを独自のクラスのメンバーとしてラップし、元のクラスへのユーザー定義の変換を提供します。大したことではありません。
  • もプリプロセッサとして知られる黒魔術を、出て行け、とすることをあなた自身のヘッダーwith something likeにヘッダを折り返す:しかし、これは明らかに、元のヘッダー経由SomeClassを使用して、他のコードとABIの互換性を壊し

    #define public \ 
        public: void operator()(void); public 
    // original header content 
    struct SomeClass { 
        // stuff 
        public: // We need this once, otherwise we're screwed 
        // other stuff 
    }; 
    // end original header content 
    #undef public 
    

    。これを行う

コード内の4つの異なる場所に関数本体をコピーする私を保存します。

は、なぜあなたはちょうどあなたがこれらの4ヶ所でcall_it(object)を書くcall_it、代わりにobject()の自由な関数を書くことができませんか?

+2

私は最後のことができない理由は 'call_it()'がオブジェクトのprivateメンバーにアクセスする必要があるということだと思います。彼はそれを友達の機能にする必要があるだろうが、彼はそれを加えることはできない。 – Barmar

+0

@Barmarああ、そうです。お気の毒に。または実行時の多型性。 –

関連する問題