Adding items to a list
-
Hi guys, I am an advanced C# coder who is trying to transition over to real coding in C++ but getting stuck on some hurdles, which normally would be easy in C#.
Here is what I am trying to do:
@
MyForm::MyForm(QWidget *parent) :
QDialog(parent),
ui(new Ui::MyForm)
{
ui->setupUi(this);
ui->myList->clear();
if (createProcessList())
{
list<ProcInfo>::const_iterator p;
for (p=procList.begin();p!=procList.end(); ++p)
{
ui->myList->addItems(*p);
}
}
}
@In C# this would work by using the base string To.String() to name the items when adding to a list, however here it seems alot different and I cannot figure it out.
Any help would be appreciated. Thanks.
Edit: Forgot to mention, procList is a list of processes already generated elsewhere in the application:
@
list<ProcInfo> procList;
@ -
-
even in C# you need to have a ToString method. How would C++ what you actually want to print. That being said. What do you want to print? The id? In that case you could have an implicit cast to QString like:
@
class ProcInfo
{
public:
//code
operator QString() const
{
return QString::number(id);
}
};
@
or you could call QString::number in the loop instead of adding an implicit cast function:
@
ui->myList->addItem(QString::number((*p).id));
@ -
[quote author="loladiro" date="1312196973"]even in C# you need to have a ToString method. How would C++ what you actually want to print. [/quote]
No you don't in C#, because when you create a class it automatically has a base ToString() method which is automatically used in certain controls like listboxes without being called (although the string would be simply the class name unless you override the method) I assumed C++ would be no different but clearly it is.
Thanks for the help.
-
The posts must have crossed in the air ;). The QString() const method is an "explicit coversion operator":http://msdn.microsoft.com/en-us/library/ts48df3y(v=vs.80).aspx . However, be aware that there are also many bugs that may follow from the misuse of this laguage feature.
EDIT: you can use it just like ou would in C# (i.e. without doing anything special)
-
Actually there are more compile errors I should have mentioned which are most likely causing this:
error: no match for 'operator=' in 'p = procList.std::list<_Tp, _Alloc>::begin with _Tp = int, _Alloc = std::allocator<int>'
-
Sorry but I can't reproduce. This all works:
@
class ProcInfo
{
public:
int id;
ProcInfo() : id(1234)
{}
operator QString() const
{
return QString::number(id);
}
};void print(QString print)
{
qDebug() << print;
}int main(int argc, char *argv[])
{
QApplication a(argc, argv);QList< ProcInfo > list1; list1 << ProcInfo(); QList< ProcInfo >::const_iterator i = list1.begin(); std::list< ProcInfo > list2; list2.push_back(ProcInfo()); std::list< ProcInfo >::const_iterator i2 = list2.begin(); print(*i2); print (*(i)); QListWidget widget; widget.addItem(*i); std::list< ProcInfo >::const_iterator p = list2.begin(); for (p=list2.begin();p!=list2.end(); ++p) { widget.addItem(*p); } widget.show(); const ProcInfo p2; print(p2); return a.exec();
}
@ -
Ok I've managed to get rid of all compile errors except this one:
error: expected type-specifier before 'QString'
And the error points to the operator:
@
class ProcInfo
{
public:
HANDLE Proc;
DWORD Base;
int ID;
operator QString() const
{
return QString::number(ID);
}
};@ -
That fixed that but now I have another problem /sigh.
I have declared std::list<ProcInfo> procList; inside a header file, and that header file is included in the main cpp file which I am doing this all in, however I get error:
error: multiple definition of `procList'
There is definitely only 1 definition and it's inside the h file so I'm a little confused, maybe c++ isn't for me :(