2010-11-30 7 views
0

Мне нужно передать указатель функции функции-члена другому классу. Я не смог его компилировать, и получаю «неопределенную ссылку на ошибку classB :: classB (classA :: *) (std :: shared_ptr)». Может кто-то помочь мне с этим?Передача функции-члена функции указателя

Спасибо.

classA{ 
    string functionA(share_ptr<int>); 
    void functionB(){ 
    classB* ptr = new classB(&classA::functionA); 
    } 
} 

//in other .h file 
classA; //forward declaration 

classB{ 
    classB(string (classA::*funcPtr)(shared_ptr<int>); //constructor 
} 
+0

У меня это получилось ... это был правильный синтаксис .. просто я не очистил какой-то старый файл, прежде чем скомпилировать его снова .. потратил впустую мои часы на это .. – Steveng 2010-11-30 04:20:32

ответ

0

Просто для смеха, идя ответить на этот вопрос, даже если вы сказали, что скомпилированные для вас ...

// In a.hpp 
#include "b.hpp" // you need to include this because you will not 
       // be able to call B's constructor in your functionB() method 

class A 
{ 
public: 
    string functionA (shared_ptr<int>); // IIRC, needs to be public to call it 
             // from B's constructor. 

    // can be public/protected/private depending on where it's called ... 
    void functionB() { 
    B * ptrB = new B (&A::functionA); 
    } 
}; 

и

// In b.hpp 

// Forward declare class A 
class A; 
// To make the constructor of B cleaner, use a typedef. 
typedef string (A::*IntPtrToStrFn) (shared_ptr<int>); 

class B 
{ 
public: 
    B (IntPtrToStrFn fnptr); 
}; 

Насколько стиль и читабельность кода идет, это ужасно - связывает эти два класса вместе и reaks кодом запаха. Вам нужно взглянуть на какой-то класс адаптера или другой шаблон проектирования, чтобы оба класса работали вместе.

0

На первый взгляд это похоже на вопрос о форвардной декларации. Попробуйте объявить classA::functionB, как вы это сделали, а затем определите classA::functionB после определения classB.

2

Ваш код, как я пишу это:

classA{ 
    string functionA(share_ptr<int>); 
    void functionB(){ 
    classB* ptr = new classB(&classA::functionA); 
    } 
} 

Здесь:

  • share_ptr должен быть shared_ptr.

  • В конце определения класса отсутствует точка с запятой.

Затем

//in other .h file 
classA; //forward declaration 

classB{ 
    classB(string (classA::*funcPtr)(shared_ptr<int>); //constructor 
} 

Здесь:

  • Есть три левые скобки (, но только две правые скобки ).

  • В конце определения класса отсутствует точка с запятой.

Вы спрашиваете о ошибке связывания, но ваш код даже не должен компилироваться.

Когда вы указываете «Я не мог его скомпилировать», это кажется правильным.

Когда вы указываете «Я получаю [неопределенную ссылку на ...]», это тайна: с помощью инструментальной цепочки, которую вы, очевидно, используете, компоновщик не должен вызываться, когда компиляция терпит неудачу.

Таким образом, этот вопрос содержит некорректную информацию и любой ответ (например, гипотезу о том, что вы не определили функцию, или гипотезу о том, что вы ее где-то определили, но забыли связать в ней или гипотезу о том, что вы «Сообщение об ошибках от создания чего-то другого, кроме вашего кода», и так далее) было бы чистой догадкой.

Пожалуйста, разместите полную небольшую программу, которая компилирует и иллюстрирует ошибку связывания.

Приветствия & НТН.,

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