2014-02-15 3 views
0

Я пытаюсь создать абстрактный класс, который позволяет вам вызвать метод Fun, который является статическим, который печатает "Abstract Class", однако он не работает, поскольку я используя *this в статическом методе. Я смущен о том, как я могу reslove эту проблему:C++ Вызов абстрактного метода из статического метода с помощью * this

class A 
{ 
private: 
    virtual void __Fun() = 0 
    { 
     std::cout << "Abstract Class"; 
    } 
    static void _Fun(A &instance) 
    { 
     instance.__Fun(); 
    } 
public: 
    static void Fun() 
    { 
     _Fun(*this); // 'this' may only be used in nonstatic member functions 
    } 
}; 

int main() 
{ 
    A a; // Throws - which is good: class is abstract 
    A::Fun(); // Desired result 
} 
+0

Как я уверен, вы знаете, в статическом контексте нет «этого». Какова общая цель здесь? –

+0

Почему вы определяете функцию, которая должна быть чистой виртуальной? – user2485710

+0

@OliCharlesworth - Я случайно вырезал статическое ключевое слово на двух из функций. Добавлено сейчас :) – Joseph

ответ

1

Myabe, что вы хотите создать не абстрактный класс, но класс с частным конструктору (как одноточечного)?

class A 
{ 
private: 
    A() 
    { 
    } 
    virtual void __Fun() 
    { 
     std::cout << "Abstract Class"; 
    } 
    static void _Fun(A &instance) 
    { 
     instance.__Fun(); 
    } 
public: 
    static void Fun() 
    { 
     A a; 
     _Fun(a); 
    } 
}; 

int main() 
{ 
    A a; // Throws - which is good: constructor is private 
    A::Fun(); // Desired result 
} 

Но тогда я не уверен, зачем вам вообще нужна эта вещь и зачем вам нужны виртуальные функции?

+0

Ваш пример не содержит абстрактного класса, поэтому он не имеет ничего общего с вопросом. –

+0

@ VladfromMoscow Я только заметил, что то, что действительно хочет OP, не является абстрактным классом, а классом, который не может быть создан. Регулярная практика SO предлагает в ответ нечто иное, чем первоначально запрошенная ОП. Даже если это не то, о чем попросил ОП вначале, это оказалось полезным. – ciamej

+0

Я этого не вижу. Он ясно говорит об абстрактном классе, и его пример содержит чистую виртуальную функцию. –

1

Вы не можете вызвать метод __Fun таким образом, потому что это требует экземпляр класса, но в свою очередь, не может создать объект абстрактного класса. Также определение вашего класса недействительно, поскольку чистый спецификатор может использоваться только в объявлении функции-члена. Определение функции может не иметь чистого спецификатора.

Чтобы achiev то, что вы хотите, вы могли бы написать, например

#include <iostream> 

class A 
{ 
protected: 
    virtual void __Fun() = 0; 
public: 
    static void Fun(A &instance) 
    { 
     instance.__Fun(); // 'this' may only be used in nonstatic member functions 
    } 
}; 

void A::__Fun() 
{ 
    std::cout << "Abstract Class"; 
} 

class B : public A 
{ 
    virtual void __Fun() { A::__Fun(); } 
}; 


int main() 
{ 
    B b; // Throws - which is good: class is abstract 
    A::Fun(b); // Desired result 
} 
+0

как эта вещь может работать, если у нас есть функция, которая одновременно является _pure virtual_ и _defined_, этот код даже не компилируется. – user2485710

+0

@ user2485710 Вы правы. –

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