Solved

Cannot modify QList when using pointer to QList

Posted on 2010-11-15
11
691 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
 

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
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 
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

6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

Join & Write a Comment

IntroductionThis article is the second in a three part article series on the Visual Studio 2008 Debugger.  It provides tips in setting and using breakpoints. If not familiar with this debugger, you can find a basic introduction in the EE article loc…
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…
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.

760 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

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now