我的问题简要说明:
class A
{
/* Other stuff in my class*/
protected static staticMember;
}
class B : A
{
/* Other stuff in my class*/
// Will have A.staticMember but I want B.staticMember (same type)
}
class C : A
{
/* Other stuff in my class*/
// Will have A.staticMember but I want C.staticMember (same type)
}
Run Code Online (Sandbox Code Playgroud)
所以我希望我的所有派生类都有一个为该特定类共享的共享数据,但在基类中定义了一个共同的签名.
我正在创建一个简单的RTS游戏,以便在我的空闲时间玩转.有几种单位(宇宙飞船,建筑物等)具有一些基本属性.这些单位可以由玩家升级(属于同一玩家的所有相同类型的单位都升级,例如.玩家A升级坦克的装甲意味着他的所有坦克将拥有更好的装甲.)
以下是我尝试实现此目的的方法:
abstract class Unit
{
/*several methods that is common for all units*/
/*We don't know the unit's attributes at …Run Code Online (Sandbox Code Playgroud) 我正在为我的库设计一个C++的异常层次结构."层次结构"是从std :: runtime_error派生的4个类.我想避免异常类的切片问题,因此使复制构造函数受到保护.但显然gcc需要在抛出它们的实例时调用复制构造函数,因此抱怨受保护的复制构造函数.Visual C++ 8.0编译相同的代码.是否有任何可移植的方法来解决异常类的切片问题?标准是否说明实现是否可以/应该要求抛出要抛出的类的复制构造函数?
这可能看起来像"家庭作业"和/或微不足道,但它是出于真正的商业目的; 这是我能想到解释我在概念上试图做的最简单的方法.
假设我有一个Animal类,以及其他一些类(Bird,Cat,Kangaroo).其中每一个都来自Animal.
动物可能看起来像这样:
public class Animal
{
public Animal()
{
}
public string Name { get; set; }
public string AnimalType { get; set; }
public List<Animal> Friends { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
袋鼠可能看起来像这样:
public class Kangaroo : Animal
{
public Kangaroo()
{
}
public int TailLengthInches { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
假设袋鼠有两个朋友,一只鸟和一只猫.我怎么能将这些添加到"动物"朋友列表(作为动物类型),但保留访问派生类属性的能力?(例如,我仍然需要能够使用特定于动物类型的属性,例如鸟类的羽毛颜色,即使它们只被视为"动物".
我试图这样做的原因是,当我后来获得动物的"朋友"列表时,我知道朋友是什么类型的动物是至关重要的.根据动物类型(无论是鸟类,猫等),我想做一些不同的事情(实际上,在ASP.NET页面上显示不同的模板,但我并不需要特别的帮助).
我想这可以归结为...如果我有一个Animal列表,我怎么知道列表中每个对象的派生类型是什么,所以我可以将它们转换回派生类型或做其他事情这允许我到达每个派生类型的特定,不同的属性?
谢谢!
我有一个Hibernate HQL问题.我想将子查询编写为派生表(出于性能原因).是否可以在HQL中执行此操作?例:
FROM Customer WHERE country.id in
(SELECT id FROM (SELECT id FROM Country where type='GREEN') derivedTable)
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,这只是一个示例查询,所以不要给出重写它的建议,只是我感兴趣的派生表概念)
有人可以解释一下为什么这段代码:
class safe_bool_base
{ //13
protected:
typedef void (safe_bool_base::*bool_type)() const;
void this_type_does_not_support_comparisons() const {} //18
safe_bool_base() {}
safe_bool_base(const safe_bool_base&) {}
safe_bool_base& operator=(const safe_bool_base&) { return *this; }
~safe_bool_base() {}
};
template <typename T=void> class safe_bool : public safe_bool_base
{
public:
operator bool_type() const
{
return (static_cast<const T*>(this))->boolean_test() ? &safe_bool_base::this_type_does_not_support_comparisons : 0;
}
protected:
~safe_bool() {}
};
template <> class safe_bool<void> : public safe_bool_base
{
public:
operator bool_type() const
{
return (boolean_test() == true) ? &safe_bool_base::this_type_does_not_support_comparisons : 0; //46
}
protected: …Run Code Online (Sandbox Code Playgroud) 我在C++中遇到问题,在调用派生类的函数的同时有一个指向基类的指针.
编辑:一些答案提到我CRTP
但我的观点是我需要一个指向"Base*"类而不是"Base*"的指针,因为我不知道当前正在处理的类型(当前实例是从某种工厂创建的).
class Base
{
..
template<typename T>
func (T arg) { ... };
};
class Derived1 : public Base
{
...
template<typename T>
func (T arg) { ... };
};
class Derived1 : public Base
{
...
template<typename T>
func (T arg) { ... };
};
Run Code Online (Sandbox Code Playgroud)
int main()
{
Base* BasePtr = new Derived1();
// The expected function to be called is Derived1::func<int>()
BasePtr->func<int>();
return 0; // :)
}
Run Code Online (Sandbox Code Playgroud)
我不能使func虚拟,因为该语言不支持虚拟模板功能.
仅当类只有模板参数时才允许,但如果其中的函数具有模板参数则不允许.
我已经看到在Boost.Serialization中解决了类似的问题,但无法理解解决方案.
谢谢,
Koby Meir
我想在模板类中定义一个类型名称,我可以在其他地方使用它来引用类中成员的类型。
template <class T>
class CA
{
public:
//typedef typename T::iterator iterator_type;
typedef typename T ElementType1; // compile error on this line
//typedef T ElementType2;
T m_element;
};
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
template <class T>
class CDerived : public CBase<typename T::ElementType1>
{
//...
};
Run Code Online (Sandbox Code Playgroud)
并声明如下对象:
typedef CDerived<CA> MyNewClass;
Run Code Online (Sandbox Code Playgroud)
这不可能吗?我有一些代码可以在 VS2010 下正确编译,但不能在使用以下行的 Xcode 下编译:
typedef typename T ElementType1;
Run Code Online (Sandbox Code Playgroud)
显然,编译器期望在 typename 之后有一个限定名称,但我不明白模板类型怎么会有一个限定名称。
我不明白 ElementType1 和 ElementType2 在这种情况下的区别。
我查看了许多有关堆栈溢出的问题,但大多数似乎仅涉及示例中的 iterator_type 之类的声明。
在C++中提供接口的最优雅方式是什么,它接受带有不同数据类型成员的派生类类型,然后需要在后面检索它们.下面的示例说明了这一点,其中Container类提供了"发布"Item的方法,该Item将是某种BaseItem的派生变体.稍后我想要获取派生的Item并提取其值.
我想要的主要是Container接口(post和receive)在将来保持不变,同时允许定义和"传递"不同的"Item"派生类型.模板会不会以某种方式变得更好; 我宁愿不使用RTTI.也许有一些简单,优雅的答案,但现在我正在努力想到它.
class ItemBase {
// common methods
};
class ItemInt : public ItemBase
{
private:
int dat;
public:
int get() { return dat; }
};
class ItemDouble : public ItemBase
{
private:
double dat;
public:
double get() { return dat; }
};
class Container {
public:
void post(int postHandle, ItemBase *e);
ItemBase* receive(int handle); // Returns the associated Item
};
int main()
{
ItemInt *ii = new IntItem(5);
Container c;
c.post(1, ii);
ItemInt *jj = c.receive(1);
int val …Run Code Online (Sandbox Code Playgroud) 我有一个
template <int N> class Base
Run Code Online (Sandbox Code Playgroud)
和
class Derived : public Base<1>
Run Code Online (Sandbox Code Playgroud)
...有没有办法int N从 a 的定义内部访问Derived::myMethod()(而不是得到编译器错误“使用未声明的标识符'N'”)?
更准确地说,我想做
void Derived::myMethod() {
for (int n=0; n<N; n++) { ...
Run Code Online (Sandbox Code Playgroud) 所以,我有一个这样的派生颜色:
derive(-fx-base, 70%)
Run Code Online (Sandbox Code Playgroud)
它还没有不透明度。有没有办法给它添加不透明度?