C++ design question
3 отговора
221 прегледа
C++ design question
Imam klas:
template<int N>
class A {
int ar[N];
}
class B : public A<5>
class C : public A<10>
dosega imah funkciq:
void f() {
B b;
b.ar[3] = 0;
}
no iskam tia veche da raboti i za obekti ot tip C. Kak bihte reshili tozi problem?
Edno reshenie koeto mi hrumva e da se napravi niakakyv klas AHolder (v nego da se
dyrjat obekti), koito da byde naslediavan ot BHolder i CHolder i tozi klas da ima
niakakyv getter za ar, koito da vikam v tazi funkciq. Primerno AHolder i BHolder
shte bydat:
class AHolder {
virtual ... getAr(...) = 0;
}
class BHolder {
B holdee;
... getAr(...) { return holdee.ar }
}
template<int N>
class A {
int ar[N];
}
class B : public A<5>
class C : public A<10>
dosega imah funkciq:
void f() {
B b;
b.ar[3] = 0;
}
no iskam tia veche da raboti i za obekti ot tip C. Kak bihte reshili tozi problem?
Edno reshenie koeto mi hrumva e da se napravi niakakyv klas AHolder (v nego da se
dyrjat obekti), koito da byde naslediavan ot BHolder i CHolder i tozi klas da ima
niakakyv getter za ar, koito da vikam v tazi funkciq. Primerno AHolder i BHolder
shte bydat:
class AHolder {
virtual ... getAr(...) = 0;
}
class BHolder {
B holdee;
... getAr(...) { return holdee.ar }
}
Re: C++ design question
пробвай това:
може и да ти свърши работа, но разбира се, трябва да се откажеш от локалните променливи. Просто ги подаваш на f() и след това си ги джуркаш както искаш...
template <int N>
class A
{
public:
int ar[N];
};
class B : public A<5>
{
};
class C : public A<10>
{
};
template <class T>
void f(T & x)
{
x.ar[3] = 0;
}
може и да ти свърши работа, но разбира се, трябва да се откажеш от локалните променливи. Просто ги подаваш на f() и след това си ги джуркаш както искаш...
template <int N>
class A
{
public:
int ar[N];
};
class B : public A<5>
{
};
class C : public A<10>
{
};
template <class T>
void f(T & x)
{
x.ar[3] = 0;
}
Re: C++ design question
или с нещо като traits:
struct Atr { typedef A Type;}
struct Btr { typedef B Type; }
template <class T>
void f(const T&)
{
T::Type b;
...
}
викаш
f(Atr());
f (Btr() );
Сигнатура!
struct Atr { typedef A Type;}
struct Btr { typedef B Type; }
template <class T>
void f(const T&)
{
T::Type b;
...
}
викаш
f(Atr());
f (Btr() );
Сигнатура!
Редактирано от Questor на
Re: C++ design question
mda, vchera syvsem ne se biah setil za templeitna funkciq.
Napravih go taka:
template <class T>
void f() {
T tralala;
}
i sled tova vikam primerno:
f<B>();
Napravih go taka:
template <class T>
void f() {
T tralala;
}
i sled tova vikam primerno:
f<B>();