C++ How to invoke an object's method in a different file

In summary, the process of invoking an object's method in a different file in C++ involves several key steps: first, ensure that the class definition is accessible by including the appropriate header file in the source file where the method will be called. Then, create an instance of the object in the calling file and use the dot operator to call the desired method on that instance. Proper understanding of object-oriented principles and file organization is essential for successful implementation.
  • #1
Bob Walance
Insights Author
Gold Member
81
55
TL;DR Summary
In C++, how to run a method from an object that was created in a separate file.
I have created an object for the class Timers in timer_functions.cpp, and I need to run a method associated with that object ( test_method() ) from interrupts.cpp.

I've tried many things but have been unsuccessful. Any ideas would be appreciated. Here is some sample code:

classes.hpp
C++:
   #pragma once
   class Timers {
   public:
     void test_method(void);
   private:
     int testVariable;
   };

classes.cpp
C++:
#include classes.hpp
   void Timers::test_method(void) {
     testVariable++;
   }

timer_functions.cpp
C++:
#include classes.hpp
   Timers myTimerObject; // create the object
interrupts.cpp
C++:
#include classes.hpp
   extern Timers myTimerObject; // this doesn't eliminate the build error
   void timer_interrupt(void) {
     myTimerObject.test_method(); // trying to run the objects method, but BUILD ERROR
   }
 
Last edited by a moderator:
Technology news on Phys.org
  • #2
I'm not clear on what you are trying to do, and how things are split up. Normally, if you have a class foo, there is a header foo.hh and the actual code in foo.cc. If I have code bar.cc, it includes foo.hh, and the linker links foo.o and bar.o.

I don't see how your snippets match to this, but you seem to be creating an instance of an object in one file and using it in another. That shouldn't work - it shouldn't even compile, because the object isn't even declared in the second file. (And if it is declared, how does the compiler know it is supposed to be the same as in the first?)

Normally code would create the object and pass it to other code through a pointer to that object. The same code that created it should destroy it when it is no longer needed,
 
  • #3
Vanadium 50 said:
I'm not clear on what you are trying to do, and how things are split up. Normally, if you have a class foo, there is a header foo.hh and the actual code in foo.cc. If I have code bar.cc, it includes foo.hh, and the linker links foo.o and bar.o.

I don't see how your snippets match to this, but you seem to be creating an instance of an object in one file and using it in another. That shouldn't work - it shouldn't even compile, because the object isn't even declared in the second file. (And if it is declared, how does the compiler know it is supposed to be the same as in the first?)

Normally code would create the object and pass it to other code through a pointer to that object. The same code that created it should destroy it when it is no longer needed,
I don't want to create and destroy the instance for each periodic timer interrupt. While this would probably work, it seems messy.

A pointer to the instance could be created in timer_functions.cpp, but how would it get passed to the timer interrupt?
 
  • #4
Bob Walance said:
I don't want to create and destroy the instance for each periodic timer interrupt. While this would probably work, it seems messy.

A pointer to the instance could be created in timer_functions.cpp, but how would it get passed to the timer interrupt?
If you intend to have only a single (global) instance of Timers, then you can use a "static" instance. In that case, read up on static class variables and static member fns.

Of course, if you do indeed intend that, then why call it "Timers" (plural) instead of "Timer" singular?
 
  • Like
Likes Vanadium 50 and Bob Walance
  • #5
strangerep said:
If you intend to have only a single (global) instance of Timers, then you can use a "static" instance. In that case, read up on static class variables and static member fns.
Wow. That works!

Yes, a single instance of the class (really it's no instance) is just fine for my application.

Thank you for the simple solution.
 

FAQ: C++ How to invoke an object's method in a different file

How do I invoke an object's method in a different file in C++?

To invoke an object's method in a different file in C++, you need to include the header file that contains the class definition in the file where you want to invoke the method. Then, create an instance of the class in the new file and call the method using the instance.

Can I invoke a private method of an object in a different file in C++?

No, you cannot directly invoke a private method of an object in a different file in C++. Private methods are only accessible within the class that defines them. If you need to invoke a private method from another file, you can create a public method in the class that calls the private method.

How do I pass objects between files in C++?

To pass objects between files in C++, you can use pointers or references. Simply create a pointer or reference to the object in the source file, and pass it as an argument to the function in the destination file where you want to use the object.

Can I invoke a static method of a class in a different file in C++?

Yes, you can invoke a static method of a class in a different file in C++. Static methods belong to the class itself rather than to any specific object, so you can call them using the class name followed by the scope resolution operator (::) in the new file.

How do I prevent name clashes when invoking methods of objects from different files in C++?

To prevent name clashes when invoking methods of objects from different files in C++, you can use namespaces. By placing the class definition and method implementations in a namespace, you can ensure that the names do not conflict with other names in the global scope.

Similar threads

Back
Top