小编use*_*100的帖子

从基类引用调用派生类方法

class Material
{
public:
 void foo()
 {
  cout << "Class Material";
 }
};

class Unusual_Material : public Material
{
public:
 void foo()
 {
  cout << "Class Unusual_Material";
 }
};

int main()
{
 Material strange = Unusual_Material();
 strange.foo(); //outputs "Class Material" 

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望这导致"Class Unusual_Material"显示在控制台上.有没有办法实现这个目标?在我的程序中,我有一个类材料,从中可以得到其他更具体的材料.方法Material :: foo()表示Material中适用于大多数材料的方法,但是在某种程度上,需要为具有不寻常属性的材料定义另一个foo().

程序中的所有对象都包含一个Material字段.如果他们被分配了一个不寻常的材料,我希望调用派生的,不寻常的foo.

这可能要么很简单,要么不可能,但无论如何我无法弄明白.

谢谢

c++ base-class derived-class

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

我们需要用c ++ 11重新编译库吗?

这是一个非常不知情的问题,但是:

我想开始使用C++ 11.我可以继续使用我的旧gcc 4.2.1编译器编译的大型库集合,还是需要使用新的编译器重新编译它们?我会想(或希望)答案是否定的,但我只是一个讨厌的人.

这样我至少可以消除部分无知,你能解释为什么在任何一种情况下?

谢谢

c++ backwards-compatibility recompile c++11

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

如果对象调整自己的容器大小会怎样?

这不是一个关于你为什么要编写这样的代码的问题,而是一个关于方法如何与它所绑定的对象相关的问题.

如果我有一个像这样的结构:

struct F
{
    // some member variables
    void doSomething(std::vector<F>& vec)
    {
        // do some stuff
        vec.push_back(F());
        // do some more stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样使用它:

std::vector<F>(10) vec;
vec[0].doSomething(vec);
Run Code Online (Sandbox Code Playgroud)

如果push_back(...)in doSomething(...)导致向量扩展会发生什么?这意味着vec[0]将在执行其方法的过程中复制然后删除.这不好.

有人可以解释这里到底发生了什么?

  • 程序会立即崩溃吗?该方法是否只是尝试对不存在的数据进行操作?
  • 该方法是否会对其对象进行"孤立"操作,直到遇到更改对象状态等问题为止?

我对方法调用如何与关联对象相关感兴趣.

c++ memory-management stl

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

在makefile中使用多个源文件扩展名

我有一个c ++项目,其中包含源文件(.cpp,.c,.cc)的各种扩展以及头文件的各种扩展(.hpp,.h,.hh).源文件位于名为SRC的目录中,并且头文件可预测地位于名为INC的目录中.

我想用像这样的规则编译源代码

vpath %.c $(SRC)

%.o: %.c
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC)
Run Code Online (Sandbox Code Playgroud)

这当然有效,如果我知道源文件的格式为%.c,但在多个可能的文件扩展名的情况下,我还需要为%.cpp和%.cc构建类似的规则.当然,编写三个规则并不是什么大不了的事情,但是能够将这个makefile用作任何项目的拖放,即使是在不同的语言中也是如此,而不必重新编写规则.

那么如何编写一个规则(或其他一些实现相同目标的构造),其工作方式如下:

SRC_EXT = cpp c cc
vpath %.$(SRC_EXT) $(SRC)

%.o: %.$(SRC_EXT)
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC)
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

file-extension makefile rules

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

将派生对象传递给想要使用java反射的超类的方法?

编辑:我不清楚.我必须使用反射,因为我从命令行解释.我正在做的反射相当于我提供的代码示例.

希望这不是重复,因为它似乎是日常想做的事情.

我有一个A类和一个扩展A的B类.如果我在C类中有一个像public void doSomething(A a)的方法,我怎么能用反射将B对象传递给这个函数?我想做(反射)相当于:

B b = new B(); //B inherits from A
C c = new C();
c.doSomething(b); // method signature is doSomething(A a);
Run Code Online (Sandbox Code Playgroud)

我所做的(使用反射)是:

  1. 获取作为函数参数的对象.
  2. 获取参数的类
  3. 根据参数的类查找方法.
  4. 调用方法,传入参数Objects.

如果我要将A对象传递给C.doSomething(...),这很有用.但是,如果我尝试将B对象传递给C.doSomething(...),则在步骤3中失败,出现此错误:

java.lang.NoSuchMethodException:C.doSomething(B)

让C.doSomething认识到B是A的合适方法是什么?(使用getDeclaredMethod(String name,Class ... parameterTypes)查找方法并将B.class作为参数类型传递时)

编辑:

我会发布我自己的解决方案,以防有人想看到一个快速入侵的方式做Roland Illig所建议的.在这个例子中,我引用了这些预先制作的变量:

String methodToken; //the name of the method
Object obj; //the object whose method we are trying to call
Object[] args; //the user given arguments for the method
Class[] argTypes; //the types of the args gotten by args[i].getClass();
Run Code Online (Sandbox Code Playgroud)

所以...

    //*** …
Run Code Online (Sandbox Code Playgroud)

java reflection methods inheritance

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

在java中编写自定义语法解释器?

我即将开始编写一个演示程序来编写我即将给出的演讲.我想让班上的每个学生都下载这个应用程序,然后能够通过命令行以交互方式创建对象实例(及其图形表示).我决定用Java写的,而不是因为它是我最熟悉的语言,而是因为它有简单的图形类,我可以很肯定的罐子会在他们的计算机上运行.

简介.现在的问题是:

为此程序实现某些自定义命令行语法的好方法是什么?我想使用一个简单,随意的语法,如:

CREATE Monster Bob;    
Bob.jump();   
LS Bob //to list Bob's methods or something.   
LS CREATE //to list all the classes    
Run Code Online (Sandbox Code Playgroud)

首先,当我想到这个问题时,我会首先想到的是什么.

我可以想象我可以在树型链接中拥有一组地图.我可以解析每个关键词作为下一个地图的关键.因此,"CREATE Monster Bob"可以被评估为

1)搜索关键字"CREATE"的关键字映射.返回值,这是对类映射的引用.2)搜索类映射关键"怪物".返回值,这是一个实现一些接口Leaf的工厂类,它让我知道它是一个叶子值(我将使用instanceof进行检查).
3)也许Leaf接口将包含一个名为execute()的方法,它可以做任何想做的事情.在这种情况下,它将创建一个Monster对象,将此对象添加到名为Objects的名为Bob的地图中.(这个Leaf业务听起来很丑,但可以清理.)

凉.但这句话对我来说有点困难:Bob.jump();

1)搜索"Bob"的一些对象图.返回一些对象实现一个接口与等的方法"评价(字符串或多个)",并将它传递字符串"跳()"
2)鲍勃搜索的用于"跳()"方法的一些内部地图,然后...?在c ++中,我将使用键作为指向要执行的成员函数Monster.jump()的指针.但是我不相信java中没有函数指针这样的东西.我已经读过你可以使用匿名类来完成这个,虽然我没有尝试过.看起来它会起作用.

所以,这将有效,但有更优雅的方式去做吗?我以前从未写过任何类型的翻译.如果有人提供一些提示,我想以一种很好的方式做一些事情并在这个过程中学到一些东西.如果我不是很结构化的话,这似乎是一种可能容易出错的方法,特别是当Bob和其他所有对象开始解析他们自己的指令并使用匿名函数时.此外,看起来除了普通代码之外,每个类都需要一个运行时就绪的接口.

我也不知道Java的那么好,所以如果有一些景点在那里我可能会撞到南墙,然后我想太了解.

我在这里先向您的帮助表示感谢.

java parsing runtime anonymous-class

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

如何避免丢弃消息zeromq pub sub

我已经看到了几个关于此的问题,但没有一个我得到满意的答案.这个问题,zeromq模式:具有保证传递的pub/sub是类似的,尽管我愿意使用任何其他zeromq机制来实现相同的效果.

我的问题是,有没有办法像ZeroMQ中的发布者订阅者一样以扇出模式发送消息,并确保消息将被传递?似乎一个零拷贝的经销商可以做到这一点,但它会比pub-sub更麻烦.有更好的选择吗?除了必须编写更多代码之外,这样做有什么缺点?

需要这个的原因:

我正在编写一个代码来分析来自仪器的数据.连接到仪器的模块需要能够将数据广播到其他模块以供它们分析.反过来,他们需要将分析的数据广播到输出模块.

乍一看,使用ZeroMQ的pub-sub看起来非常适合这项工作,但如果任何用户放慢速度并达到高水位,则消息会被丢弃.在该系统的情况下,由于事件的连续性,仅在一小部分模块上丢弃消息是不可接受的.所有模块都需要分析事件以使输出有意义.但是,如果没有模块收到事件的消息,那就没问题了.因此,如果其中一个分析模块达到了高水位,则可以阻止发布者(仪器模块).

我认为另一个替代方案是在事后处理错过的消息,但这只会浪费处理时间以后将被丢弃的事件.

编辑:我想进一步考虑这个,我目前期望发送消息=消息传递,因为我正在使用inproc并在线程之间进行通信.但是,如果我通过tcp发送消息,即使ZeroMQ没有故意丢弃它,也有可能丢失消息.这是否意味着即使我使用阻止发送,我可能还需要处理丢弃的消息?是否有关于使用inproc进行消息传递的保证?

c++ publish-subscribe zeromq

3
推荐指数
2
解决办法
6123
查看次数

可以使用OpenGL将实值三角形绘制到缓冲区中吗?

我需要实现图像重建,其涉及在表示图像中的像素的缓冲区中绘制三角形.为这些三角形分配一些要填充的浮点值.如果绘制三角形使得它们重叠,则必须将重叠区域的值相加.

是否可以使用OpenGL实现这一目标?我想利用栅格化三角形是一个可以在显卡上加速的基本图形任务这一事实.我已经有了这个算法的仅cpu实现,但是对于我的目的来说它还不够快.这是由于需要绘制大量三角形.

具体来说我的问题是:

  1. 我可以使用openGL绘制具有实际值的三角形吗?(或者我可以想出一个使用颜色等的黑客?)
  2. OpenGL可以添加三角形重叠的值吗?(再次,我可以处理黑客,如混色)
  3. 我可以恢复像素的实际值作为浮点数或类似的数组进行进一步处理吗?
  4. 我对使用OpenGL绘图 - >使用GPU绘制 - >可能更快执行的想法有误解吗?

另外,我想在虚拟机上运行此代码,因此,据我所知,加速使用OpenGL比在Cuda中使用Cuda这样的实现更可行.这是真的?

编辑:累积缓冲区是一个选项吗?

c++ opengl gpu

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

从派生对象获取基础对象的地址

我的程序中出现了一个非常令人困惑的错误.我想我可能有两个同一类的不同对象,我认为我有相同的对象.这很令人困惑,因为我正在处理一个非常大的框架,在这个框架中获取指向我需要的对象的指针并不简单.

我的问题是,如果我有一个继承自Base的Derived类,并且我有一个指向Derived对象的指针,我怎样才能从派生对象中获取Base对象的地址?我正在使用基类的源代码,并在Base中打印出"this"的地址.在我的代码的另一部分中,检索指向Derived的指针.我需要能够通过Derived对象打印Base对象的地址,以确定我是否有指向我需要的特定Derived对象的指针.

我可能对地址如何在继承中使用C++有很大的误解.也许它们只是一个对象,而不是链接到派生对象的基础对象?

非常感谢你

编辑:我想这样做的原因纯粹是为了调试.问题是我使用的代码库不包含很多接口或受保护的成员,所以我不得不编辑源代码来访问某些信息.但是,当我调用我使用特定的Derived指针添加到Base类的方法时,我的程序崩溃了.我需要能够在这种情况下打印基础对象的地址,以便我可以确定这是否是正确的对象或我是否收到此错误,因为我实际上有一个指向错误对象的指针.我意识到我可以将代码添加到派生类中以使其打印其地址,但我只是想知道是否有可能在不编辑源代码的情况下获取地址.谢谢

c++ pointers derived base memory-address

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

如何应对返回指针的生命周期?

我正在制作一组表示图像的类.这个类的一个应用是在一组平铺图像上绘制图片.抽象图像类看起来像这样:

class Image
{
public:
    virtual Pixel* findPixel( Point p ) =0;
    virtual bool isDrawable( Point p ) =0;
    virtual bool contains( Point p ) =0;
};
Run Code Online (Sandbox Code Playgroud)

我想到的问题是,如果我创建一个这样的类:

class TiledImage : public Image
{
    std::vector<Image*> tiles;

public:
    Pixel* findPixel( Point p )
    {
        // find the tile that contains the point.
        // ask it for the pixel that contains the point.
        // return the pixel.
    }

    // etc....

};
Run Code Online (Sandbox Code Playgroud)

设计用于根据需要创建,保存和删除非常大的图像的子部分(图块),然后用户可以存储指向最终可能不再存在的Pixel对象的指针.

一个选项是要求用户在完成后检查像素,例如:

Pixel* p = image.findPixel( aPoint );
// do stuff …
Run Code Online (Sandbox Code Playgroud)

c++ reference lifetime

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