How to access variables from another class in ue4 c++

Hello, unreal community I have a problem that I have been trying to understand for a while how would I access other variables in another class, for example, I have a class called player pickup and a player class and in the player class there is an int counter and in the pickup class I want to be able to add 1 every time the player picks up an item and could someone give me a step by step example of how to do it as well if you need me to explain a bit more just ask thank you in advance.

// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.

#include "MyFPSGame.h"
#include "Kismet/HeadMountedDisplayFunctionLibrary.h"
#include "MyFPSGameCharacter.h"

//////////////////////////////////////////////////////////////////////////
// AMyFPSGameCharacter

AMyFPSGameCharacter::AMyFPSGameCharacter()
{
	// Set size for collision capsule
	GetCapsuleComponent()->InitCapsuleSize(42.f, 96.0f);

	// set our turn rates for input
	BaseTurnRate = 45.f;
	BaseLookUpRate = 45.f;

	// Don't rotate when the controller rotates. Let that just affect the camera.
	bUseControllerRotationPitch = false;
	bUseControllerRotationYaw = false;
	bUseControllerRotationRoll = false;

	// Configure character movement
	GetCharacterMovement()->bOrientRotationToMovement = true; // Character moves in the direction of input...	
	GetCharacterMovement()->RotationRate = FRotator(0.0f, 540.0f, 0.0f); // ...at this rotation rate
	GetCharacterMovement()->JumpZVelocity = 600.f;
	GetCharacterMovement()->AirControl = 0.2f;

	// Create a camera boom (pulls in towards the player if there is a collision)
	CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
	CameraBoom->SetupAttachment(RootComponent);
	CameraBoom->TargetArmLength = 300.0f; // The camera follows at this distance behind the character	
	CameraBoom->bUsePawnControlRotation = true; // Rotate the arm based on the controller

	// Create a follow camera
	FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
	FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); // Attach the camera to the end of the boom and let the boom adjust to match the controller orientation
	FollowCamera->bUsePawnControlRotation = false; // Camera does not rotate relative to arm

	// Note: The skeletal mesh and anim blueprint references on the Mesh component (inherited from Character) 
	// are set in the derived blueprint asset named MyCharacter (to avoid direct content references in C++)
	
	// Sets the player counter to 0.
	playerCounter = 0;

}

//////////////////////////////////////////////////////////////////////////
// Input

void AMyFPSGameCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
{
	// Set up gameplay key bindings
	check(PlayerInputComponent);
	PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
	PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACharacter::StopJumping);

	PlayerInputComponent->BindAxis("MoveForward", this, &AMyFPSGameCharacter::MoveForward);
	PlayerInputComponent->BindAxis("MoveRight", this, &AMyFPSGameCharacter::MoveRight);

	// We have 2 versions of the rotation bindings to handle different kinds of devices differently
	// "turn" handles devices that provide an absolute delta, such as a mouse.
	// "turnrate" is for devices that we choose to treat as a rate of change, such as an analog joystick
	PlayerInputComponent->BindAxis("Turn", this, &APawn::AddControllerYawInput);
	PlayerInputComponent->BindAxis("TurnRate", this, &AMyFPSGameCharacter::TurnAtRate);
	PlayerInputComponent->BindAxis("LookUp", this, &APawn::AddControllerPitchInput);
	PlayerInputComponent->BindAxis("LookUpRate", this, &AMyFPSGameCharacter::LookUpAtRate);

	// handle touch devices
	PlayerInputComponent->BindTouch(IE_Pressed, this, &AMyFPSGameCharacter::TouchStarted);
	PlayerInputComponent->BindTouch(IE_Released, this, &AMyFPSGameCharacter::TouchStopped);

	// VR headset functionality
	PlayerInputComponent->BindAction("ResetVR", IE_Pressed, this, &AMyFPSGameCharacter::OnResetVR);
}


void AMyFPSGameCharacter::OnResetVR()
{
	UHeadMountedDisplayFunctionLibrary::ResetOrientationAndPosition();
}

void AMyFPSGameCharacter::TouchStarted(ETouchIndex::Type FingerIndex, FVector Location)
{
	// jump, but only on the first touch
	if (FingerIndex == ETouchIndex::Touch1)
	{
		Jump();
	}
}

void AMyFPSGameCharacter::TouchStopped(ETouchIndex::Type FingerIndex, FVector Location)
{
	if (FingerIndex == ETouchIndex::Touch1)
	{
		StopJumping();
	}
}

void AMyFPSGameCharacter::TurnAtRate(float Rate)
{
	// calculate delta for this frame from the rate information
	AddControllerYawInput(Rate * BaseTurnRate * GetWorld()->GetDeltaSeconds());
}

void AMyFPSGameCharacter::LookUpAtRate(float Rate)
{
	// calculate delta for this frame from the rate information
	AddControllerPitchInput(Rate * BaseLookUpRate * GetWorld()->GetDeltaSeconds());
}

void AMyFPSGameCharacter::MoveForward(float Value)
{
	if ((Controller != NULL) && (Value != 0.0f))
	{
		// find out which way is forward
		const FRotator Rotation = Controller->GetControlRotation();
		const FRotator YawRotation(0, Rotation.Yaw, 0);

		// get forward vector
		const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
		AddMovementInput(Direction, Value);
	}
}

void AMyFPSGameCharacter::MoveRight(float Value)
{
	if ( (Controller != NULL) && (Value != 0.0f) )
	{
		// find out which way is right
		const FRotator Rotation = Controller->GetControlRotation();
		const FRotator YawRotation(0, Rotation.Yaw, 0);
	
		// get right vector 
		const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
		// add movement in that direction
		AddMovementInput(Direction, Value);
	}
}

// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "GameFramework/Character.h"
#include "MyFPSGameCharacter.generated.h"

UCLASS(config=Game)
class AMyFPSGameCharacter : public ACharacter
{
	GENERATED_BODY()

	/** Camera boom positioning the camera behind the character */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
	class USpringArmComponent* CameraBoom;

	/** Follow camera */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
	class UCameraComponent* FollowCamera;
public:
	AMyFPSGameCharacter();

	/** Base turn rate, in deg/sec. Other scaling may affect final turn rate. */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera)
	float BaseTurnRate;

	/** Base look up/down rate, in deg/sec. Other scaling may affect final rate. */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera)
	float BaseLookUpRate;

protected:

	/** Resets HMD orientation in VR. */
	void OnResetVR();

	/** Called for forwards/backward input */
	void MoveForward(float Value);

	/** Called for side to side input */
	void MoveRight(float Value);

	/** 
	 * Called via input to turn at a given rate. 
	 * @param Rate	This is a normalized rate, i.e. 1.0 means 100% of desired turn rate
	 */
	void TurnAtRate(float Rate);

	/**
	 * Called via input to turn look up/down at a given rate. 
	 * @param Rate	This is a normalized rate, i.e. 1.0 means 100% of desired turn rate
	 */
	void LookUpAtRate(float Rate);

	/** Handler for when a touch input begins. */
	void TouchStarted(ETouchIndex::Type FingerIndex, FVector Location);

	/** Handler for when a touch input stops. */
	void TouchStopped(ETouchIndex::Type FingerIndex, FVector Location);

	// Player counter
	int playerCounter;

protected:
	// APawn interface
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
	// End of APawn interface

public:
	/** Returns CameraBoom subobject **/
	FORCEINLINE class USpringArmComponent* GetCameraBoom() const { return CameraBoom; }
	/** Returns FollowCamera subobject **/
	FORCEINLINE class UCameraComponent* GetFollowCamera() const { return FollowCamera; }
};

// Fill out your copyright notice in the Description page of Project Settings.

#include "MyFPSGame.h"
#include "playerPickup.h"


// Sets default values
AplayerPickup::AplayerPickup()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

// Called when the game starts or when spawned
void AplayerPickup::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void AplayerPickup::Tick( float DeltaTime )
{
	Super::Tick( DeltaTime );

}

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "GameFramework/Actor.h"
#include "playerPickup.generated.h"

UCLASS()
class MYFPSGAME_API AplayerPickup : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AplayerPickup();

	// Called when the game starts or when spawned
	virtual void BeginPlay() override;
	
	// Called every frame
	virtual void Tick( float DeltaSeconds ) override;

	
	
};

Hey are232-

You will first need to add an include statement in your pickup class for your character so that the pickup can recognize the character class / functions. Then, the best way to increase the variable would be to have a SetVariable() function in your character class that is public. When your pickup wants to increase the variable value, you can call AMyFPSGameCharacter::SetVariable().

Cheers

Hey, -
I have done what you have said and I get an error message saying, class AMyFPSGameCharacter a nonstatic member reference must be relative to a specific object my code is down below.
// Fill out your copyright notice in the Description page of Project Settings.

#include "MyFPSGame.h"
#include "playerPickup.h"
#include "MyFPSGameCharacter.h"


// Sets default values
AplayerPickup::AplayerPickup()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;
	trigger = CreateDefaultSubobject<USphereComponent>(TEXT("Trigger sphere"));
	RootComponent = trigger;
	trigger->SetHiddenInGame(false);
	trigger->bGenerateOverlapEvents = true;
	trigger->OnComponentBeginOverlap.AddDynamic(this, &AplayerPickup::pickupTrigger);
}

// Called when the game starts or when spawned
void AplayerPickup::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void AplayerPickup::Tick( float DeltaTime )
{
	Super::Tick( DeltaTime );

}

void AplayerPickup::pickupTrigger(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult &SweepResult) {
	UE_LOG(LogTemp, Warning, TEXT("This trigger works"));
	Destroy();
	AMyFPSGameCharacter::incrementCounter(); // This line is giving me the error
}

You have to specify the object that you are calling the incrementCounter function on. If you add the following in place of line 36 you should be able to compile without running into the error you mentioned.

UWorld* WorldRef = GetWorld();
AMyFPSGameCharacter* CharacterRef = Cast<AMyFPSGameCharacter>(World->GetFirstPlayerController()->GetCharacter());
if (CharacterRef)
{
	CharacterRef->incrementCounter();
}

Thank you, , it works so the GetWorld(); does that check to see if the game world exists? as well how would I use that code u put to use it with other class I have? for example, an actor class and another actor class thank you in advance.

Yes, GetWorld() is used to ensure that the game world exists. To use this type of coding for other classes you just need to remember to add an include statement for the class that you want to access and then create a variable or pointer of the class type. For more examples on how code is used in UE4 I would suggest checking out the programming tutorials:

https://docs.unrealengine.com/latest/INT/Videos/PLZlv_N0_O1gYup-gvJtMsgJqnEB_dGiM4/mSRov77hNR4/index.html

I will check them out thanks for all your help .