|
When we talk about a library we generally mean a DLL (.so in linux world) or static library (.a in linux) that is linked in with your code. That being the case, there is only one instance of any given library during the execution of a single process1, even if its multi threaded. Either you don't understand this, or you're using the term library to refer to something else. If the latter, you need to explain your concerns differently.
The difference between a DLL and a static library, in case you don't know, is that the functions in a static library are linked in at compile time, while dynamic libraries are linked in at run time. That means that when a change is introduced in a library (bug fix, for example), a program that is linked against a static library needs to be relinked after the static library has been compiled and installed. A program that is linked against a DLL gets the benefit of the change the next time it is run, without the need to relink it.
1There is a way to get multiple copies of a shared library attached to a single process, but that involves using dlopen() and friends, which I assume you're not doing here.
Update: Just checked, multiple calls to dlopen() does not attach multiple instances of a library to a process, so ignore that bit.
"A little song, a little dance, a little seltzer down your pants"
Chuckles the clown
modified 30-May-24 15:56pm.
|
|
|
|
|
Thank you for your constructive contribution to this discussion. Appreciate your input and now I have a better understanding of the process.
|
|
|
|
|
This post original subject - error: declaration of anonymous class must be a definition
was caused by this class declaration
< class REG_EXP
{
int a;
QString text;
QString RegExp;
QString Analyze;
} TEST_REG_EXP;
/pre>
Search for the symbol "REG_EXP" in the entire project returned no result.
The conclusion
it is unknown why the error was posted.
Please consider this matter closed.
modified 30-May-24 19:43pm.
|
|
|
|
|
What the compiler is trying to tell you is that you have an invalid function definition, namely
void PassTrace(class *Pointer);
Think about that a little bit. What is the type of Pointer ? If your definition of PassTrace (i.e. the place where you provide the code for the function) matches the given declaration, how would you access any of Pointer 's members? Does the class have member a , or a member name , value ? There's no way to know.
Perhaps you meant
void PassTrace(Test *Pointer) or maybe you want a Template?
template <typename T>
void PassTrace<T *Pointer>
{
}
If you know that you'll never need to test *Pointer for null, you might consider using a reference rather than a pointer, and if you're not going to change the contents of what Pointer points to, then consider marking it as const as well.
Other than that, passing a pointer to a class (or struct) is no different that passing a pointer to anything else:
class myClass {
};
void f(myClass *pointer)
{
}
int main()
{
myClass c;
f(&c); }
"A little song, a little dance, a little seltzer down your pants"
Chuckles the clown
|
|
|
|
|
Thank you, appreciate your reply.
I did JUST modify my working test function and do not see why my definition is wrong.
I am obviously missing something VERY basic here.
Should it work this way ?
void BT_Utility_Library::PassTrace(class *)
// {
// //qDebug()<<pointer.
};
<pre="" lang="C++">
// void BT_Utility_Library::PassTrace(class *Pointer)
// {
// //qDebug()<<Pointer.
// };
void BT_Utility_Library::AddFive(int* Number)
{
*Number = *Number + 5;
}
|
|
|
|
|
void BT_Utility_Library::PassTrace(class *)
You cannot have a pointer that has no definition. The class keyword is usaed to define an actual class, whether abstract or not. In the definition above the pointer must be of an actual class so the compiler knows what to do with any statements that use it.
modified 26-May-24 6:44am.
|
|
|
|
|
consider:
class A { }
class B { }
class C { }
void f(class *ptr);
Which class does ptr refer to in void f(class *ptr) ? The definition of void f(class *ptr) makes as much sense as void f(const i) . There's no type associated with the parameter, so the compiler does not know what type the parameter is.
Note: The use of class or struct for a variable/parameter declaration is optional in C++ :
class C { }
int main()
{
class C c1;
C c2;
} the declarations of c1 and c2 are both valid, and both declare a object of type class C
"A little song, a little dance, a little seltzer down your pants"
Chuckles the clown
|
|
|
|
|
Sorry, what was the question?
|
|
|
|
|
error: declaration of anonymous class must be a definition
and do not known how and where to correct this error.
STAND BY
I have another fish to fry and I need to rebuild this task from scratch.
I took a wrong approach and that is why I got this error.
|
|
|
|
|
UPDATE
DONE
"Match any number of characters , (from start of the line) , until "new line \n " is reached :
QRegularExpression re( ".*\n");
TODO
match first word only (of each line )
match the entire text (first word of each line )
I am VERY sorry to be such bother, but I am actually looking
for someone / somebody willing to help me to interpret ( read) the Linux
regular expression manual to build the expression.
My task is to
match each and every FIRST word in multi-line string .
I am stuck at
"\w+"
which matches EVERY word in the entire text
I can post my current code when I get
"I am willing help you..."
response
Thank you very much for understanding .
Sal
modified 28-May-24 12:39pm.
|
|
|
|
|
|
Salvatore Terress wrote: using non C++ tool
I am guessing that you meant you found another solution so you did not need to use C++.
Because you can certainly build an interpreter and/or a regex engine using C++.
|
|
|
|
|
Thanks for reply. I have riposted this, hoping for help with constructing with C++ reg expression .
|
|
|
|
|
I'm trying to straighten out some pointer "arithmetic" in some existing code. The expressions themselves are overly ambiguous to say the least. In part of my readings, I've come across the "auto" keyword where the compiler deduces what type I need. At least that's what I got from all of the verbiage.
This seems a) dangerous and b) adds another level of mental indirection to what you are trying to accomplish. To me, software needs to be very clear and explicit in what data you are working with and what you intend to do with it. A lot of the "here is how auto will help you" descriptions justify it by saving typing when trying to make use of other classes, templates and the like. It feels like the C++ committee came up with a feature A then added feature B to make using A easier. I'm now doing battle with lambda expressions - another story.
So, in your code - do you make extensive use of auto, and how does it help you?
Charlie Gilley
“They who can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.” BF, 1759
Has never been more appropriate.
|
|
|
|
|
charlieg wrote: do you make extensive use of auto, Not "extensive" but I use it frequently. In some cases there is no way to go around it (when you have a lambda closure for instance), in other cases it is just convenient (like long container iterator types), and in a few cases it is surprisingly useful. One such case is in combination with IntelliSense when I have doubts about the final type of an expression. I do something like:
auto var = and, when I hoover over var , IntelliSense will obligingly tell me what the compiler thinks the variable type is. I know it's a bit silly (and maybe lazy) but hey, it helps me.
How I learned to stop worrying and start loving the auto
Mircea
modified 19-May-24 9:31am.
|
|
|
|
|
Mircea Neacsu wrote: IntelliSense will obligingly tell me that the compiler thinks it the variable type. I think this is the best use for auto in C++ or var in C#.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
I haven't touched C/C++ in a long time, but C# has the similar var. I used to use it until I recognized how unreadable it made code. It forces you to know more than you really need to know and is, frankly, a lazy way to write code.
I do still use it but only in the lazy way of using Intellisense to figure out what the actual type is supposed to be and give me the option of replacing var with the actual type. It has recently come in handy last week when using an API client library generated by Swagger code gen and the holy-sh*t-those-are-long-class-names it generated. The longest is 86 characters long, and average about 40-45. I'm not typing those. I have to get the code working this week, not next year.
|
|
|
|
|
I use it.
Suppose you have
unordered_map<string, int> um{ {"foo", 1}, {"goo", 2}, {"boo",42}};
I find
for (const auto & p : um)
{
cout << p.first << ", " << p.second << "\n";
}
'somewhat simpler' when compared to
for (const pair<string, int> & p : um)
{
cout << p.first << ", " << p.second << "\n";
}
Maybe I am used to it.
"In testa che avete, Signor di Ceprano?"
-- Rigoletto
|
|
|
|
|
The only time I don't use auto is to override the type that the compiler would deduce. That's very rare, usually with the size of a numeric. auto is almost always a type returned by a function, or maybe the type of a class member, so there's nothing "dangerous" about it in those situations. Someone reading the code needs to be familiar with the functions and classes being used, or they're fooling themselves as to their level of understanding.
|
|
|
|
|
I use auto as much as I can.
I will still use types for POD.
I also use variable names that makes sense so that I know what type the variable should be (obviously not hungarian reverse or not notation)
CI/CD = Continuous Impediment/Continuous Despair
|
|
|
|
|
POD?
Charlie Gilley
“They who can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.” BF, 1759
Has never been more appropriate.
|
|
|
|
|
Plain Old Data.
usually simple types like int, char, float...
CI/CD = Continuous Impediment/Continuous Despair
|
|
|
|
|
It appears to me that you may be doing much programming that doesn't really fit into a strong, static typing world. Maybe a dynamically typed language, with any variable having the type of its value (at any time) would suit your problems better.
I love the strictness of strong static typing. It makes it possible for the compiler to give me far more detailed and to-the-point error messages and warnings. When reading the code, it provides more information, making it simpler to comprehend the code.
There are situations where auto/var is required, e.g. in database operations; I am not objecting to using in in such cases. In most cases, you can extract the values to strongly typed variables. I do not leave them in untyped variables for long.
Corollary, I try to avoid deep subclass nesting. Choosing between having to inspect 4-6 superclass definitions to find the definition of a field (hopefully with a comment explaining its use) or extending a superclass with a field that for some instances are left unused, I definitely prefer the latter. (I have many times seen subclasses created for adding a single field - even with several sibling classes adding the same single field!)
Religious freedom is the freedom to say that two plus two make five.
|
|
|
|
|
I think you're confusing things up.
C++ is still strongly typed even when you use auto.
when I declare a variable with auto, it will be typed accordingly and I cannot change the type.
CI/CD = Continuous Impediment/Continuous Despair
|
|
|
|
|
Maximilien wrote: when I declare a variable with auto, it will be typed accordingly and I cannot change the type.
Err...in C++?
Rather certain you can in fact change the type. Not generally a good idea but one can certainly do it.
char* s = ....;
int* p = (int*)s;
I have seen very limited situations where it provided value.
|
|
|
|