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

  • Context: C/C++ 
  • Thread starter Thread starter Bob Walance
  • Start date Start date
  • Tags Tags
    C++ programming
Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
4 replies · 4K views
Bob Walance
Insights Author
Gold Member
Messages
84
Reaction score
55
TL;DR
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:
on Phys.org
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,
 
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?
 
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?
 
Reply
  • Like
Likes   Reactions: Vanadium 50 and Bob Walance
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.