2016-05-30 3 views
1

Предположим, у меня есть класс, который я называю MyString. И я хочу, чтобы это было абстрактным классом, который выглядит примерно так:Форсировать неклассовые функции для существования?

class MyString{ 
    virtual MyString* operator+(char* other) = 0; 
    virtual MyString* operator+(MyString* other) = 0; 
}; 

operator+ просто используется в качестве оператора конкатенации. Мой вопрос заключается в том, как заставить другого оператора следующим образом:

MyString* operator+(char* first, MyString* other) = 0; 

Выполняется классом, который происходит от этого класса.

Обратите внимание, что эта функция обычно должна находиться вне класса.

Есть ли способ сделать это?

+1

Как это работает? Вы не можете делать виртуальную отправку на бесплатной функции. Поэтому вам нужно будет сделать 'append' (чистую) функцию' virtual' member и заставить ее таким образом. Затем вы можете вызвать 'append' в свой' operator + ', который определяется только на верхнем уровне иерархии. – BoBTFish

+0

Кроме того, вы действительно хотите использовать '+' для 'append'? Подумайте о семантике. Например, ожидание состоит в том, что '+' обычно является коммутативным: '1 + 2 == 2 + 1 == 3', но' 'a" + "b"! = "B" + "a" '. – BoBTFish

ответ

1

Во-первых, C++ не является C, и указатели обычно избегают. Вы хотите, чтобы это:

class MyString{ 
    virtual MyString* operator+(char* other) = 0; 
    virtual MyString* operator+(MyString& other) = 0; 
}; 

Во-вторых, вы забыли const и public, так что вы действительно хотите:

class MyString{ 
public: 
    virtual MyString* operator+(const char* other) const = 0; 
    virtual MyString* operator+(const MyString& other) const = 0; 
}; 

В-третьих, для вашей задачи, если я правильно понял, что вам нужно:

class MyString{ 
public: 
    virtual MyString* operator+(const char* other) const = 0; 
    virtual MyString* operator+(const MyString& other) const = 0; 
    virtual MyString* append_to(const char* other) const = 0; // x.append_to(y) is y+x 
}; 

inline MyString* operator+(const char* x, const MyString& y) {return y.append_to(x);} 

PS: изменен MyString на MyString * как возвращаемый тип.

+0

Семантика этого взгляда - хотя вы * должны * избегать указателей, как вы говорите, чтобы воспользоваться преимуществами виртуальных машин, которые вам нужно переместить в реализацию указателя, а виртуальные методы будут во внутреннем классе, а не в классе, , – Hurkyl

+0

@ Hurkyl - правильный. Я изменил MyString на MyString * как возвращаемый тип. – user31264

Смежные вопросы