簡體   English   中英

在實現文件中添加成員函數

[英]Adding member function in implementation file

對於家庭作業,我提供了一個骨架類,並要求其從源文件的頭中實現功能。 我不允許更改標頭,因為它不會被上交,只能更改實現文件。

但是,確實有一個我想添加到類中的函數(operator()函數)。 如何在不更改標題的情況下將其聲明為類的一部分?

我無法添加朋友功能(要求更改標題中的類定義)。 我不能只在源代碼的頂部實現它(行外定義不匹配...)。 我無法在頂部重新聲明班級(重新定義班級)。

這有可能嗎? 這樣做可以避免將函數主體復制到代碼中的4個不同位置。

僅供參考,它是圓形雙向鏈表的訪問器。 operator []用於訪問列表元素,我需要一個訪問器來返回列表元素指針。 作為參考,運算符如下所示:

// 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;
};

但是,確實有一個我想添加到類中的函數( operator()函數)。 如何在不更改標題的情況下將其聲明為類的一部分?

基本上,您不能。

您可以執行以下任一操作:

  • 從該類派生並在其中添加您的operator() 當然,當其他代碼必須使用具有值語義的原始類時,這是行不通的。
  • 將類包裝為您自己的類的成員,並提供對原始類的用戶定義轉換。 大多數情況下都不漂亮。
  • 找出黑魔法(也稱為預處理器),然后將標題包裝在自己的標題中,如下所示

     #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 

    但是,這顯然破壞了使用SomeClass通過其原始標頭與其他代碼的ABI兼容性。

這樣做可以避免將函數主體復制到代碼中的4個不同位置。

為什么不能只編寫一個自由函數call_it ,而在這4個地方而不是object()編寫call_it(object)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM