[英]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.