[solved] QHash's insert() wrong use? --> VS-Debugger showed botch data due to missing Qt-Addon for VS
-
@ludde: Yes at that moment SpecialObject has got one QString and 5 qint32 attributes.
However, this is going to be developed and thus rising.@ZapB: Thatswhy I wrote an own class for it, I know that I need special format for output purposes late on. And thatswhy I haven't take "struct".
Anyway, creating my object on the heap does not solve my problem either. During debugging I can see botch values in pDataController as on the screenshot above. And same CXX0030 error.
-
[quote author="ZapB" date="1309781440"]Looks to me like you have not properly implemented the assignment and/or copy constructor of your SpecialObject class properly.
@Hunger I thought QHash took a copy of objects when you insert them rather than using a reference to them as you are implying?[/quote]
Correct!
bq. To quote from the "docs about container classes":http://doc.qt.nokia.com/4.7/containers.html
The values stored in the various containers can be of any assignable data type. To qualify, a type must provide a default constructor, a copy constructor, and an assignment operator. This covers most data types you are likely to want to store in a container, including basic types such as int and double, pointer types, and Qt data types such as QString, QDate, and QTime, but it doesn't cover QObject or any QObject subclass (QWidget, QDialog, QTimer, etc.). If you attempt to instantiate a QList<QWidget>, the compiler will complain that QWidget's copy constructor and assignment operators are disabled. If you want to store these kinds of objects in a container, store them as pointers, for example as QList<QWidget *>.And more important:
bq. If we don't provide a copy constructor or an assignment operator, C++ provides a default implementation that performs a member-by-member copy.
Theses autogenerated operators and constructors are most likely not sufficient!
-
Here you have compileable but not yet linkable codes. LinkError see bottom.
DataItem.cpp
@#include "DataItem.h"
#include <QString>
DataItem::DataItem()
{
this->dataID = 0;
this->dataCon = 0;
this->dataCat = 0;
this->dataName = "defName";
}DataItem::DataItem(qint32 tId, QString tName, qint32 tCat, qint32 tCon)
{
this->dataID = tId;
this->dataCon = tCon;
this->dataCat = tCat;
this->dataName = tName;
}qint32 DataItem::getID() const { return this->dataID; }
QString DataItem::getName() const { return this->dataName; }
qint32 DataItem::getCat() const { return this->dataCat; }
qint32 DataItem::getCon() const { return this->dataCon; }
DataItem::~DataItem(void) {}@
DataItem.h
@#pragma once#include <QString>
class DataItem
{
public:
DataItem();
DataItem(qint32 tId, QString tName, qint32 tCat, qint32 tCon);
~DataItem(void);qint32 getID() const;
QString getName() const;
qint32 getCat() const;
qint32 getCon() const;private:
qint32 dataID;
QString dataName;
qint32 dataCat;
qint32 dataCon;
};@DataController.cpp
@#include <QHash>
#include "DataController.h"
#include "DataItem.h"//DataController::DataController(void)
//{
//
//}//void DataController::addNew(DataItem * tPI) { this->myQHash.insert(tPI->getID(), *tPI); }
void DataController::addNew(qint32 tID, QString tName, qint32 tCat, qint32 tCon)
{
//DataItem tPI (tID, tName, tCat, tCon);
DataItem * tPI = new DataItem(tID, tName, tCat, tCon);
this->myQHash.insert(tID, tPI);
}DataController::~DataController(void) {}@
DataController.h
@
#pragma once#include <QString>
#include <QHash>
#include "DataItem.h"class DataController
{
public:
//DataController(void);
~DataController(void);
//void addNew(DataItem * tPI);
void addNew(qint32, QString, qint32, qint32);private:
QHash<qint32, DataItem*> myQHash;
};@MyDockWidget.cpp
@#include "MyDockWidget.h"
#include "DataController.h"
#include <QString>
MyDockWidget::MyDockWidget( )
{
//DataController myDataController;
}int MyDockWidget::main(int p_argsc, char *p_argsv[] )
{
//this->myDataController = new DataController();
myDataController.addNew(2511, "Heim", 20481, 1272923);
myDataController.addNew(2512, "Work", 20482, 1272963);
// Breakpoint herereturn 1;
}
@MyDockWidget.h
@#ifndef MY_DOCK_WIDGET_H
#define My_DOCK_WIDGET_H
#include <QString>
#include "DataController.h"class MyDockWidget
{
//Q_OBJECTpublic: /// @brief constructor MyDockWidget(); DataController myDataController;
int main( int p_argsc, char *p_argsv[] );
};
#endif // MY_DOCK_WIDGET_H
@I now get a Linker-Error:
1>Linking...
1>DataItem.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QString::~QString(void)" (_imp??1QString@@QAE@XZ) referenced in function __unwindfunclet$??0DataItem@@QAE@XZ$0but I did not use any Libs or Dlls??! How is that be?
-
@Gerolf: Yes the compilation is not my problem ;) My linker will not link my stuff ;)
@ZapB: Ok, I included the %QTDIR%qt4.5.0libQtCore4.lib to
Project --> Properties --> Linker --> General --> Add additional Libraries. But same linker error as above.bq. 1>Linking...
1>DataItem.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QString::~QString(void)" (_imp??1QString@@QAE@XZ) referenced in function __unwindfunclet$??0DataItem@@QAE@XZ$0
1>DataController.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall QString::~QString(void)" (_imp??1QString@@QAE@XZ)
////etc....
1>deldel3 - 19 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========Qstring is in QtCore as well as far as I know?
The main? Is that wrong?
-
[quote author="ludde" date="1309856111"]The main function is inside the MyDockWidget class - looks really weird to me... Does the main function not have to be global?[/quote]
This project is in real a *.dll. I just extracted the required methods and classes to reproduce my QHash problem.
Hint: The original projects were generated by cmake, which should add corresponding libs correctly.
-
Here is my vproj file:
@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="deldel3"
ProjectGUID="{19DD986F-AEBE-4C05-8309-B174DE1C1C3F}"
RootNamespace="deldel3"
TargetFrameworkVersion="196613"<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
UseOfMFC="0"
CharacterSet="2"<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories=""C:\\Qt\\qt-win-opensource-src-4.5.0\\include\\QtGui";"C:\\Qt\\qt-win-opensource-src-4.5.0\\include\\QtCore";"C:\\Qt\\qt-win-opensource-src-4.5.0\\include""
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="2"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkLibraryDependencies="false"
UseUnicodeResponseFiles="false"
AdditionalLibraryDirectories=""C:\\Qt\\qt-win-opensource-src-4.5.0\\lib\\QtCored4.lib";"C:\\Qt\\qt-win-opensource-src-4.5.0\\lib\\QtCore4.lib""
GenerateDebugInformation="true"
EntryPointSymbol="main"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
GenerateDebugInformation="true"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"<File
RelativePath=".\\DataController.cpp"
>
</File>
<File
RelativePath=".\\DataItem.cpp"
>
</File>
<File
RelativePath=".\\MyDockWidget.cpp"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"<File
RelativePath=".\\DataController.h"
>
</File>
<File
RelativePath=".\\DataItem.h"
>
</File>
<File
RelativePath=".\\MyDockWidget.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
@Thank you for your patience. Cheers Huck
[EDIT: code formatting, use @-tags, not 'quote', Volker]