views:

178

answers:

3

Is this scenario even possible?

class Base
{
  int someBaseMemer;
};

template<class T>
class Derived : public T
{
  int someNonBaseMemer;

  Derived(T* baseInstance);
};

Goal:

Base* pBase = new Base();
pBase->someBaseMemer = 123; // Some value set
Derived<Base>* pDerived = new Derived<Base>(pBase);

The value of pDerived->someBaseMemer should be equeal to pBase->someBaseMember and similar with other base members.

+5  A: 

Why would you want to derive and pass the base pointer at the same time? Choose either, nothing stops you from having both. Use inheritance to do the job for you:

class Base
{
  public:
    Base(int x) : someBaseMemer(x) {}
  protected:      // at least, otherwise, derived can't access this member
    int someBaseMemer;
};

template<class T>
class Derived : public T
{
  int someNonBaseMemer;

  public:
  Derived(int x, int y) : someNonBaseMemer(y), T(x) {}
};

Derived<Base> d(42, 32); // usage

Though not the best of choices as design.

dirkgently
It surprises me how eager people are to vote up answers the miss the point. What's the point of a Derived(int, int) constructor when the Base class has more members? In your example class Derived : public Base would be better, since the Derived class has to recognize the Base class' members. Yet it still doesn't answer my question.
AOI Karasu
You wholly miss my point, unfortunately, which was about letting the compiler do the copying. Your example is a mess -- that doesn't help at all to get your point across.
dirkgently
Luckily there was someone able to understand my mess and answer my question.
AOI Karasu
+1  A: 

Declare someBaseMemr as public or change the declaration from class to struct:

class Base
{
  public:
  int someBaseMemer;
};

OR

struct Base
{
  int someBaseMemr;
};

Remember that a class has private access to all members and methods by default. A struct provides public access by default.

Also, all derived classes should have public inheritance from Base.

Thomas Matthews
The poster's technique is a pattern that allows on to change base classes or the derivation path of the derived class. I've used this technique also.
Thomas Matthews
+1  A: 

Why wouldn't you actually finish writing and compiling the code?

class Base 
{ 
public: // add this
    int someBaseMemer; 
}; 

template<class T> 
class Derived : public T 
{ 
public: // add this
    int someNonBaseMemer; 

    Derived(T* baseInstance)
        : T(*baseInstance) // add this
    { return; } // add this
}; 

This compiles and runs as you specified.

EDIT: Or do you mean that someNonBaseMemer should equal someBaseMemer?

MSN
Derived(T* baseInstance) : T(*baseInstance) is the solution. I tried T(baseInstance) and got stuck on the compiler error. Compiler error messages involving templates eg. SomeClass<T>::NestedClass<T>::blablah give me the creeps. Thank you.
AOI Karasu
AOI Karasu