Solved

Cannot modify QList when using pointer to QList

Posted on 2010-11-15
11
700 Views
Last Modified: 2012-05-10
Hi,
I've got a class with a number of QLists defined as follows:
 QList<Vertex> m_surfaceVertices;
 QList<Vertex> m_windowVertices;
 QList<Vertex> m_holeVertices;

Vertex is simply a class I've defined that has 3 public GLdouble members.

I have three functions that do processing on each of the QLists, they are called:
ProcessSurfaces, ProcessWindows, ProcessHoles and are identical apart from the fact I am using a different QList.

So I'd like to refactor those into a single function that takes an int representing whether m_surfaceVertices, m_windowVertices or m_holeVertices are to be processed.

The way I'm doing this is:

QList<Vertex>* theVertices = NULL;

then a switch statement which simple assigns theVertices with the address of the appropriate QList:

theVertices = &m_surfaceVertices

However, when I try to modify the x, y and z members of one of the Vertex is in the QList, I get compiling errors:

theVertices(i).x = 4;

throws up

Error      1      error C2039: 'x' : is not a member of 'QList<T>'

I've tried everything I can think of (casting, putting brackets in, using at(J) etc) and don't understand why I can't do this.

After all, I have a pointer to the QList and am accessing a Vertex so should be able to modify it?

Any help is greatly appreciated.

Thanks

Note: I had to replace square brackets in code above.
0
Comment
Question by:vedeveloper
  • 6
  • 5
11 Comments
 
LVL 40

Expert Comment

by:evilrix
ID: 34135486
Did you mean this?

theVertices[i].x = 4;

Open in new window

Note, square not round brackets.
0
 
LVL 40

Accepted Solution

by:
evilrix earned 500 total points
ID: 34135496
Actually, it should probably be this...

(*theVertices)[i].x = 4;

Open in new window

0
 

Author Comment

by:vedeveloper
ID: 34135521
Ta. I had to put round brackets in place of square brackets when posting the message
0
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 

Author Comment

by:vedeveloper
ID: 34135553
Putting in your second changes lets the code compile but it crashes here.

QList<Vertex>::operator[](int i=0)  Line 447 + 0x18 bytes      C++

I'll check that it isn't anything else in that function that is causing the crash.

0
 

Author Comment

by:vedeveloper
ID: 34135559
By the way, it looks like that is an index out of range error.
0
 
LVL 40

Expert Comment

by:evilrix
ID: 34135632
>> By the way, it looks like that is an index out of range error.

Well the error itself means the correct operator is probably getting called now so I'd go out on a limb and say I think the original issue is resolved but, as you say, you probably now have a new your you've unravelled.
0
 

Author Comment

by:vedeveloper
ID: 34135653
Thanks.

Ahh, the crash occurs when calling theVertices.size() which is used in an assertion in the [] operator.

Any ideas?
0
 
LVL 40

Expert Comment

by:evilrix
ID: 34135827
We'll it sounds to be like it's asserting that the index value you are using is actually valid and within the correct range. You could prove this by using at() rather than operator[] since at will throw and exception you can catch if the index is invalid.

http://www.cplusplus.com/reference/stl/vector/at/

try
{
   (*theVertices)[i].x = 4;
}
catch(out_of_range const & e)
{
    // if we get here our index value is invalid
}

Open in new window

0
 

Author Comment

by:vedeveloper
ID: 34136053
As soon as I modify the vertex, it throws the whole QList off.

So to get round this I just created a copy of the vertex I wanted to modify and then replaced it with QList::replace call.

Thanks for your help, it put me on the right track.
0
 
LVL 40

Expert Comment

by:evilrix
ID: 34136059
You are very welcome.
0
 

Author Closing Comment

by:vedeveloper
ID: 34136062
The solution solved the initial problem in that I couldn't get the code to compile.

This lead to another problem I was able to fix myself.
0

Featured Post

Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

856 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question