我觉得我跳过了一两个C#课程,但这是我的困境:
我有一个抽象类,我从中派生出多个子类.
我确信,对于每个子类,我将有一个构造函数,它需要一个特定的静态对象作为模型,并且这个对象对于每个子类都是不同的.
我的第一种方法是在抽象父类中创建一个公共静态对象然后,在我开始创建子类的任何实例之前,我会为它们中的每一个修改它,但事实证明这样我实际上只做了一个静态对象,用于抽象类,每个子类都使用它.
我怎么能解决这个问题?
更确切地说,这是伪代码:
父抽象类:
abstract class AbstractClass
{
static public ModelObject Model;
...
}
Run Code Online (Sandbox Code Playgroud)
其中一个子课程:
class Child : AbstractClass
{
...
public Child()
{
this.someField = Model.someField;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
Model需要是"ModelObject"类的成员,它不应该是单例或其他任何东西.
EDIT2:
更确切地说,我选择了这种实施方案来进行国际象棋游戏:我有一个抽象类的棋子,而儿童类代表了游戏的具体部分:棋子,骑士等等.
抽象类继承自MeshMatObject,这是一个表示具有基本功能的通用3d对象的类,如旋转,网格,材质,纹理等,它定义了象棋游戏块的抽象方法,如GetPossibleMoves().
我上面讨论的Model对象是MeshMatObject的一个成员,在我看来,应该只在类外定义一次,然后用于所有的部分.我的意思是:例如,所有的棋子都有相同的网格和纹理,所以每次你想制作一个棋子时,我都没有看到将模型作为参数的意义.
我在应用程序上有一个RichTextBox控件,这就是我的问题:当应用程序运行时,如果我开始用鼠标选择一个单词中的一些字符并继续在它外面选择,则选择会自动包含我开始选择的整个单词如果我没有弄错的话,我想从中选择一个部分的任何其他单词,ms word-ish.
例如:
问题在于鼠标选择,如果我用键盘选择文本就可以了.此外,控件的自动字选择属性被关闭.知道为什么会这样吗?
我还是C++的新手,所以我每天遇到新问题.
今天来了[]运营商:
我正在使自己成为一个新的通用List类,因为我真的不喜欢std的那个.我试图给它C#的Collections.Generic列表的温暖和模糊的外观,所以我希望能够通过索引访问元素.切入追逐:
从模板中提取:
T& operator[](int offset)
{
int translateVal = offset - cursorPos;
MoveCursor(translateVal);
return cursor->value;
}
const T& operator[](int offset) const
{
int translateVal = offset - cursorPos;
MoveCursor(translateVal);
return cursor->value;
}
Run Code Online (Sandbox Code Playgroud)
这是运营商的代码.模板使用"模板",所以就我在一些教程中看到的那样,这是进行操作符重载的正确方法.
然而,当我试图通过索引访问时,例如:
Collections::List<int> *myList;
myList = new Collections::List<int>();
myList->SetCapacity(11);
myList->Add(4);
myList->Add(10);
int a = myList[0];
Run Code Online (Sandbox Code Playgroud)
我明白了
no suitable conversion function from "Collections::List<int>" to "int" exists
Run Code Online (Sandbox Code Playgroud)
错误,引用"int a = myList [0]"行.基本上"myList [0]"类型仍然是"Collections :: List",虽然它应该只是int.怎么会?
我有这个问题:
template<typename T> class Bubu
{
...
int (*comparer)(const T t1, const T t2);
...
public:
Bubu(int (*_comparer)(const T t1, const T t2))
{
comparer = _comparer;
}
};
Run Code Online (Sandbox Code Playgroud)
在另一个文件中:
Bubu<char*> asd(strcmp);
Run Code Online (Sandbox Code Playgroud)
错误:
error C2664: 'Bubu<T>::Bubu(int (__cdecl *)(const T,const T))' :
cannot convert parameter 1 from 'int (__cdecl *)(const char *,
const char *)' to 'int (__cdecl *)(const T,const T)'
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.编译器不应该看到"char*"而不是"T"吗?
编辑:Ideone.com准备好的代码:
int asdf(const char* a, const char* b)
{ return 0; }
template class Bubu
{
int (*comparer)(const T …Run Code Online (Sandbox Code Playgroud) 将材质数据传递给opengl(在着色器中使用):
float white[4] ={1.0f,1.0f,1.0f,1.0f};
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, white);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, white);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, white);
Run Code Online (Sandbox Code Playgroud)
int whitei[4] = {255,255,255,255};
glMaterialiv(GL_FRONT_AND_BACK, GL_AMBIENT, whitei);
glMaterialiv(GL_FRONT_AND_BACK, GL_DIFFUSE, whitei);
glMaterialiv(GL_FRONT_AND_BACK, GL_SPECULAR, whitei);
Run Code Online (Sandbox Code Playgroud)
第一个是美妙的,但第二个只给出黑色网格.两者都用在完全相同的上下文中(基本上我写了第一个,然后第二个替换了第一个).
有谁知道为什么会这样?glMaterialiv真的会让我的生活更轻松(如果我可以让它工作),因为我保持我的颜色为rgba字节,我不确定我是否想让它们变大4倍只是为了将它们转换为浮点数.
我制作了一个可爱的通用(即模板)List类来处理C++中的列表.原因是我发现这个std::list类在日常使用中非常难看,而且由于我经常使用列表,我需要一个新的.主要的改进是,我的班级,我可以用来[]从中获取物品.此外,还有待实现的是一个IComparer对事物进行排序的系统.
我正在使用这个List类OBJLoader,我的类加载Wavefront .obj文件并将它们转换为网格.OBJLoader包含指向以下"类型"的指针列表:3D位置,3D法线,uv纹理坐标,顶点,面和网格.顶点列表具有必须链接到所有3D位置,3D法线和uv纹理坐标列表中的某些对象的对象.面链接到顶点,网格链接到面.所以他们都是相互联系的.
为简单起见,让我们考虑一下,在某些情况下,只有两个指针列表:List<Person*>和List<Place*>.Personclass包含,其中包括字段List<Place*> placesVisited和Place类包含字段List<Person*> peopleThatVisited.所以我们有结构:
class Person
{
...
public:
Place* placeVisited;
...
};
class Place
{
...
public:
List<People*> peopleThatVisited;
};
Run Code Online (Sandbox Code Playgroud)
现在我们有以下代码:
Person* psn1 = new Person();
Person* psn2 = new Person();
Place* plc1 = new Place();
Place* plc2 = new Place();
Place* plc2 = new Place();
// make some links between …Run Code Online (Sandbox Code Playgroud) c++ pointers list dynamic-memory-allocation dangling-pointer