小编can*_*rem的帖子

C#抽象类静态字段继承

我觉得我跳过了一两个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的一个成员,在我看来,应该只在类外定义一次,然后用于所有的部分.我的意思是:例如,所有的棋子都有相同的网格和纹理,所以每次你想制作一个棋子时,我都没有看到将模型作为参数的意义.

c# inheritance static field abstract

16
推荐指数
2
解决办法
2万
查看次数

C#RichTextBox选择问题

我在应用程序上有一个RichTextBox控件,这就是我的问题:当应用程序运行时,如果我开始用鼠标选择一个单词中的一些字符并继续在它外面选择,则选择会自动包含我开始选择的整个单词如果我没有弄错的话,我想从中选择一个部分的任何其他单词,ms word-ish.

例如:

  • 文字是:"只是另一个foobar"
  • 我想要选择的是:"只是ano [ther foo] bar"([]之间的东西)
  • 实际选择的是什么:"只是[另一个foobar]"

问题在于鼠标选择,如果我用键盘选择文本就可以了.此外,控件的自动字选择属性被关闭.知道为什么会这样吗?

c# controls

9
推荐指数
2
解决办法
3292
查看次数

C++ []运算符重载问题

我还是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.怎么会?

c++ overloading operator-keyword

4
推荐指数
1
解决办法
1594
查看次数

模板内部的C++函数指针

我有这个问题:

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)

c++ templates function-pointers

1
推荐指数
1
解决办法
323
查看次数

opengl glMaterialfv vs glMaterialiv

将材质数据传递给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倍只是为了将它们转换为浮点数.

opengl colors material

1
推荐指数
1
解决办法
1719
查看次数

在C++中动态分配列表

我制作了一个可爱的通用(即模板)List类来处理C++中的列表.原因是我发现这个std::list类在日常使用中非常难看,而且由于我经常使用列表,我需要一个新的.主要的改进是,我的班级,我可以用来[]从中获取物品.此外,还有待实现的是一个IComparer对事物进行排序的系统.

我正在使用这个ListOBJLoader,我的类加载Wavefront .obj文件并将它们转换为网格.OBJLoader包含指向以下"类型"的指针列表:3D位置,3D法线,uv纹理坐标,顶点,面和网格.顶点列表具有必须链接到所有3D位置,3D法线和uv纹理坐标列表中的某些对象的对象.面链接到顶点,网格链接到面.所以他们都是相互联系的.

为简单起见,让我们考虑一下,在某些情况下,只有两个指针列表:List<Person*>List<Place*>.Personclass包含,其中包括字段List<Place*> placesVisitedPlace类包含字段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

0
推荐指数
1
解决办法
8256
查看次数