【问题标题】:Create many objects of same kind when array of objects is not allowed当不允许对象数组时创建许多相同类型的对象
【发布时间】:2014-04-30 00:28:19
【问题描述】:

我有一个类不允许创建相同类型的对象数组。

例如: Canvas c; 我无法创建Canvas c[5]

是否有可能我可以通过外部某处修改字符串 c,即在 i 后附加 c 并循环,并且应该能够放置在 Canvas 之后。

字符串操作部分生成c1c2c3c4

我可以把这些放在Canvas之后吗?

这是相同的代码:

//C++ Headers
#include <iostream>

//ROOT Headers
#include <TCanvas.h>


using namespace std;

void CanvasArray(){
    TCanvas c[5] = new TCanvas("c[5]", "", 400, 500); 
    for (int i; i<5; i++)
        c[i]->Draw();

}

然后,输出:

Processing CanvasArray.C...
Error: Can't call TCanvas::TCanvas((class TCanvas*)0x98d76a8) in current scope CanvasArray.C:12:
Possible candidates are...
(in TCanvas)
/usr/lib/i386-linux-gnu/root5.34/libGpad.so  -1:-1   0 private: TCanvas TCanvas::TCanvas(const TCanvas& canvas); //cannot copy canvas, use TObject::Clone()
/usr/lib/i386-linux-gnu/root5.34/libGpad.so  -1:-1   0 public: TCanvas Canvas::TCanvas(Bool_t build=kTRUE);
/usr/lib/i386-linux-gnu/root5.34/libGpad.so  -1:-1   0 public: TCanvas TCanvas::TCanvas(const char* name,const char* title="",Int_t form=1);
/usr/lib/i386-linux-gnu/root5.34/libGpad.so  -1:-1   0 public: TCanvas TCanvas::TCanvas(const char* name,const char* title,Int_t ww,Int_t wh);
/usr/lib/i386-linux-gnu/root5.34/libGpad.so  -1:-1   0 public: TCanvas TCanvas::TCanvas(const char* name,const char* title,Int_t wtopx,Int_t wtopy,Int_t ww,Int_t wh);
/usr/lib/i386-linux-gnu/root5.34/libGpad.so  -1:-1   0 public: TCanvas TCanvas::TCanvas(const char* name,Int_t ww,Int_t wh,Int_t winid);
(in TPad)
*** Interpreter error recovered ***

[19]+  Stopped                 root -l CanvasArray.C

【问题讨论】:

  • "是否有可能我可以通过外部某处修改字符串 c,即在 c 后面加上 i 并循环,并且应该能够放置在 Canvas 之后" 嗯? “在画布之后”是什么意思?字符串是从哪里来的?
  • @David Schwartz,我正在尝试获取 Canvas c1、c2、c3 .....、c100,但是,我希望标签 c1、c2.... c100 在外部某处生成为字符串,但后来放在 Canvas 之后,因为我无法初始化该特定对象的数组。
  • @Pgram 这是 C 还是 C++?为什么不能初始化一个数组?
  • 它可以与 C++ 一起使用,但它不允许我这样做,每当我尝试初始化它时代码都会中断。
  • 我不认为TCanvas c[5] = new TCanvas("c[5]", "", 400, 500); 看起来正确...您正在尝试使用指向单个对象的单个指针初始化一个包含 5 个对象的数组。你可以 TCanvas c[5]; 默认初始化 5 个对象,然后循环遍历它们并重新初始化/修改具有特定值的对象吗?

标签: c++ arrays string object


【解决方案1】:

你可以使用std::vector:

void CanvasArray(){
    std::vector<TCanvas> c;
    for (int i = 0; i<5; i++) {
        c.emplace_back("c[5]", "", 400, 500);
        c[i].draw();
    }   

}

【讨论】:

  • ROOT 方法通常以大写首字母书写。 TCanvas::Draw 也是如此。所以应该是c[i].Draw(); 而不是c[i].draw();
【解决方案2】:

请注意,您通常应避免在 ROOT 中使用相同名称的不同对象。 ROOT 带有Form 函数,其工作方式类似于Cprintf 函数(尽管它避免了一些char* 声明)。

此外,如前所述,std::vector 可能是您作为容器类的朋友。由于您的初始示例使用new,因此我在这里举一个示例,我将TCanvas* 放入容器而不是TCanvas

//C++ Headers
#include <iostream>
#include <vector>

//ROOT Headers
#include <TCanvas.h>



void CanvasArray(){
    std::vector<TCanvas*> c;
    for (int i=0; i<5; i++) {
        c.push_back(new TCanvas(Form("c%d",i), "", 400, 500));
        c[i]->Draw();
    }

}

【讨论】:

    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2020-03-06
    相关资源
    最近更新 更多